华为笔试4.29
今晚华为的三道笔试题本菜鸡居然都做出来了,开始膨胀
人生第一次啊
我是java写的哈。
我的题目是
获取字符串排列组合数量
删除字符 加密
还有约会城市道路硬币啥的
题目可能不一样,嗨呀
第一题思路:
map存每个字符出现数量。
然后字符数量的阶乘除以每个字符数量的阶乘
比如 aabbbcccc
答案:9!/2!/3!/4!
private static int getNum(char[] ch) {
Map<Character,Integer> map=new HashMap<Character,Integer>(8);
for(int i=0;i<ch.length;i++){
if(map.containsKey(ch[i])){
int value=map.get(ch[i]);
map.put(ch[i], value+1);
}else{
map.put(ch[i], 1);
}
}
int len=ch.length;
int res=1;
while(len!=1){
res=res*len;
len--;
}
for(Character c:map.keySet()){
int value=map.get(c);
while(value!=1){
res=res/value;
value--;
}
}
return res;
} 第二题思路:
循环k次删k个字母,
每次循环比较相邻两个,前一个大就删除前一个,比如bca,就删除c
如果某次没有删除 说明字母从小到大排列,比如aabbcc,那直接从后往前删就行了。
private static void getAnswer(String str, int k) {
ArrayList<Character> list=new ArrayList<Character>();
for(int i=0;i<str.length();i++){
list.add(str.charAt(i));
}
int size=list.size();
int nn=0;
boolean flag=false;
for(int i=0;i<k;i++){
for(int j=0;j<list.size()-1;j++){
if(list.get(j)>list.get(j+1)){
list.remove(j);
break;
}
}
nn=i;
if(list.size()==size-i){
flag=true;
break;
}
}
if(flag){
for(int i=nn;i<k;i++){
list.remove(list.get(list.size()-1));
}
}
for(int i=0;i<list.size();i++){
System.out.print(list.get(i));
}
} 第三题思路:
遍历路径,找到源城市和当前(传入参数start)相同的道路,同时判断钱够不够用,够的就递归(硬币数量减少,道路长度增加,当前城市改变)
记录每次最小路径值,返回
/**
k硬币数量
n城市数量
r道路数量
arr数组
start当前城市
l当前路径
*/
private static int getAnswer(int k, int n, int r, int[][] arr, int start, int l) {
if (start == n) {
return l;
}
int min = Integer.MAX_VALUE;
int temp = -1;
for (int i = 0; i < r; i++) {
if (arr[i][0] == start && arr[i][3] <= k) {
temp = getAnswer(k - arr[i][3], n, r, arr, arr[i][1], l + arr[i][2]);
}
if (min >= temp && temp != -1) {
min = temp;
}
}
if (min != Integer.MAX_VALUE) {
return min;
}
return -1;
} 也不知道有没有说明白,嗨呀我尽力了。。
我好像没碰到90的情况,捂脸,可能运气太好了
代码可以私信加微信发哈
#华为#
查看17道真题和解析