华为笔试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的情况,捂脸,可能运气太好了
代码可以私信加微信发哈
#华为#