年薪35万的华为机试题,你完成需要多长时间?
最近一个朋友通过了华为的面试,需要去参加华为机试,具体什么岗位我就不说了,说年薪可以达到35~40万元,当然了,拿这个年薪在华为应该算是一般水平了,但是相比社会上的其他企业,这样的工资还是蛮吸引人的,回来的时候,给我们分享了一下机试的题目。
题目描述
给定一串字符,里面有些字符有连续出现的特点,请寻找这些连续字符串中最长的串,如果最长的串有多个,请输出ascii最小的一串?
测试字符串
321,23322a1,12fffdddaa23
答题要求
答题时间限制在90分钟以内,不可以上网查询,可以使用Java/Python/C#等任何语言实现。
解题思路
从第一个字符开始,遍历循环每一个字符,利用maxBegin和maxEnd来记录当前连续出现的子字符串的起始位置,如果当前字符串长度大于历史最大字符串长度,或者两者长度一样,但当前的字符串ASCII码小于之前的,就要用当前的字符串覆盖历史最长的字符串,这里要注意最后一个字符的边界问题。
当我这个朋友在给我们分享面试题目的时候我还在想,就这么一道题还需要90分钟吗?如果开发环境具备,半个小时肯定搞定,于是晚上回家以后,打开电脑思考编写,果然半个小时没有搞定,折腾了一个小时才搞定,具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | public class CalcFunc { public static String MaxRepeatString(String str){ if (str== null ||str.trim().length()== 0 ){ return "" ; } if (str.length()< 2 ){ return str; } int maxBegin = 0 ; int maxEnd = 1 ; char [] charString = str.toCharArray(); String tempStr = "" ; String maxLenStr = "" ; for ( int i= 0 ;i<charString.length- 1 ;i++){ maxEnd = i+ 1 ; if (charString[i]==charString[i+ 1 ]){ tempStr = str.substring(maxBegin, maxEnd+ 1 ); } else { tempStr = str.substring(maxBegin, maxEnd); maxBegin = maxEnd; //不相等时,改变截取字符串的开始位置 } if (tempStr.length()>maxLenStr.length()){ maxLenStr = tempStr; } else if (tempStr.length()==maxLenStr.length()&&maxLenStr.length()> 0 ){ if (( int )(tempStr.charAt( 0 ))<( int )(maxLenStr.charAt( 0 ))) { maxLenStr = tempStr; } } if (maxEnd==charString.length- 1 ){ //最后一次遍历,并且 if (maxLenStr.length()== 1 ){ if (( int )(charString[charString.length- 1 ])<( int )(maxLenStr.charAt( 0 ))) { maxLenStr = String.valueOf(charString[charString.length- 1 ]); } } } } return maxLenStr; } while ( true ) { System.out.println( "请输入给定的字符串!" ); Scanner input = new Scanner(System.in); String st = input.nextLine(); System.out.println(MaxRepeatString(st)); } } |
在做完上述题目以后,通过百度搜索了一下华为的机试题,发现还有其他类似的机试题,下面是我整理的几道机试题及实现方式。
一、题目一
题目描述
在字符串中找出连续最长的数字串,并把这个串的长度返回。如果存在长度相同的连续数字串,返回最后一个连续数字串。
解题思路
遍历该字符串每一个字符,判断当前字符是否为数字(可以通过获取该字符的ASCII或者使用正则表达式来判断是否是数字),如果当前字符是数字,则从上次出现非数字字符的位置(初始为0)截取到该字符,与当前最大长度的数字串相比较,如果大于等于当前最长的字符串,则当前字符串是最大长度的字符串。
特别说明
数字串只需要是数字组成的就可以,并不需要顺序,比如数字串“1234”的长度小于数字串“1359055”,如果没有数字,则返回空字符串而不是NULL!(说明:不需要考虑负数)
实现代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | public class CalcFunc { public static String MaxLenDigitString(String str){ String maxLenDigitStr = "" ; int begin = 0 ,end = 0 ; String tempStr = "" ; for ( int i= 0 ;i<str.length();i++){ end = i+ 1 ; int chr = str.charAt(i); if (chr>= 48 && chr<= 57 ){ tempStr = str.substring(begin,end); } else { begin = end; } if (tempStr.length()>=maxLenDigitStr.length()){ maxLenDigitStr = tempStr; } } return maxLenDigitStr; } public static void main(String[] args) { while ( true ) { System.out.println( "请输入给定的字符串!" ); Scanner input = new Scanner(System.in); String st = input.nextLine(); Calendar calendar= Calendar.getInstance(); SimpleDateFormat dateFormat= new SimpleDateFormat( "yyyy-MM-dd :hh:mm:ss:SSS" ); System.out.println( "开始计算时间:" +dateFormat.format(calendar.getTime())); String result = MaxLenDigitString(st); System.out.println(result); System.out.println(result.length()); dateFormat= new SimpleDateFormat( "yyyy-MM-dd :hh:mm:ss:SSS" ); System.out.println( "结束计算时间:" +dateFormat.format(calendar.getTime())); } } } |
二、题目二
题目描述
找出输入字符串中的重复字符,再根据ascii把重复的字符从小到大排序
解题思路
遍历一遍字符串数组,建立一个辅助的TreeMap,里面key=字符 value=字符个数,排序就是TreeMap会默认按键的ascii从小到大排列,省去排序的部分,最后就把value>1的输出就完事了
实现代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | public class CalcFunc{ public static String GetRepeatCharByASCII(String str){ String maxLenDigitStr = "" ; StringBuffer buf= new StringBuffer(); char [] chars = str.toCharArray(); TreeMap<Character, Integer> map = new TreeMap<Character, Integer>(); for ( int i= 0 ;i<str.length();i++) if (!map.containsKey(chars[i])) map.put(chars[i], 1 ); else map.put(chars[i],map.get(chars[i])+ 1 ); Iterator<Character> iterator = map.keySet().iterator(); Character key; while (iterator.hasNext()) { key = iterator.next(); if (map.get(key)> 1 ) buf.append(key); } maxLenDigitStr =buf.toString(); return maxLenDigitStr; } public static void main(String[] args) { while ( true ) { System.out.println( "请输入给定的字符串!" ); Scanner input = new Scanner(System.in); String st = input.nextLine(); Calendar calendar= Calendar.getInstance(); SimpleDateFormat dateFormat= new SimpleDateFormat( "yyyy-MM-dd :hh:mm:ss:SSS" ); System.out.println( "开始计算时间:" +dateFormat.format(calendar.getTime())); String result = GetRepeatCharByASCII(st); System.out.println(result); System.out.println(result.length()); dateFormat= new SimpleDateFormat( "yyyy-MM-dd :hh:mm:ss:SSS" ); System.out.println( "结束计算时间:" +dateFormat.format(calendar.getTime())); } } } |
三、题目三
题目描述
给定一个字符串,里面会有连续重复出现的字符,比如aabbbcddeaf,要求把连续重复的字符只保留一个,比如上面的字符串处理之后就变成了abcdeaf。
解题思路
比较当前字符与前一个字符是否相等,如果相等就删除前一个字符,不相等则直接向下遍历
实现代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | public class HelloWorld { public static String GetRepeatChar(String str){ String maxLenDigitStr = "" ; StringBuffer newstring = new StringBuffer(str); for ( int i= 1 ; i < newstring.length();i++){ if (newstring.charAt(i) == newstring.charAt(i- 1 )){ newstring.deleteCharAt(i- 1 ); i--; } } maxLenDigitStr = newstring.toString(); return maxLenDigitStr; } public static void main(String[] args) { while ( true ) { System.out.println( "请输入给定的字符串!" ); Scanner input = new Scanner(System.in); String st = input.nextLine(); Calendar calendar= Calendar.getInstance(); SimpleDateFormat dateFormat= new SimpleDateFormat( "yyyy-MM-dd :hh:mm:ss:SSS" ); System.out.println( "开始计算时间:" +dateFormat.format(calendar.getTime())); String result = GetRepeatChar(st); System.out.println(result); System.out.println(result.length()); dateFormat= new SimpleDateFormat( "yyyy-MM-dd :hh:mm:ss:SSS" ); System.out.println( "结束计算时间:" +dateFormat.format(calendar.getTime())); } } } |
四、题目四
题目描述
将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出,如ad2f3adjfeainzzzv,输出23adefijnvz
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | public class HelloWorld { public static String GetRepeatChar(String str){ String maxLenDigitStr = "" ; StringBuffer buf= new StringBuffer(); char [] chars = str.toCharArray(); TreeMap<Character, Integer> map = new TreeMap<Character, Integer>(); for ( int i= 0 ;i<str.length();i++) if (!map.containsKey(chars[i])) map.put(chars[i], 1 ); else map.put(chars[i],map.get(chars[i])+ 1 ); Iterator<Character> iterator = map.keySet().iterator(); Character key; while (iterator.hasNext()) { key = iterator.next(); //if(map.get(key)<2) buf.append(key); } maxLenDigitStr =buf.toString(); return maxLenDigitStr; } public static void main(String[] args) { while ( true ) { System.out.println( "请输入给定的字符串!" ); Scanner input = new Scanner(System.in); String st = input.nextLine(); Calendar calendar= Calendar.getInstance(); SimpleDateFormat dateFormat= new SimpleDateFormat( "yyyy-MM-dd :hh:mm:ss:SSS" ); System.out.println( "开始计算时间:" +dateFormat.format(calendar.getTime())); String result = GetRepeatChar(st); System.out.println(result); System.out.println(result.length()); dateFormat= new SimpleDateFormat( "yyyy-MM-dd :hh:mm:ss:SSS" ); System.out.println( "结束计算时间:" +dateFormat.format(calendar.getTime())); } } } |
五、题目五
题目描述
给出n对字符串,找到每对字符串中最大公共子串。
示例
2 //表示有2组
fsjdfgjs //第一组
fdfg
fdslkdfj //第二组
fjdkdfs
输出格式:
3 //第一组,最大公共字串dfg
3 //第二组,最大公共子串kdf
解题思路
找到较短的字符串,然后从中依次取子串,这个依次取子串有点讲究,要先取最长的然后慢慢减短,这使得如果找到就是最长的公共子串;在将子串依次与较长的字符串比较,如果包含则为最长公共子串
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | public class HelloWorld { // 两个字符串中最大的公共子串 public static String Max(String s1, String s2) { String max = (s1.length() > s2.length()) ? s1 : s2; String min = max.equals(s1) ? s2 : s1; for ( int i = 0 ; i < min.length(); i++) { for ( int m= 0 ,n=min.length()-i ; n!=min.length()+ 1 ; m++, n++) { String sub = min.substring(m, n); if (max.contains(sub)) { return sub; } } } return null ; } public static void main(String[] args) { Scanner in = new Scanner(System.in); String number = in.nextLine(); int num = Integer.parseInt(number); String[] str = new String[num* 2 ]; for ( int i= 0 ; i<num* 2 ; i++){ str[i] = in.nextLine(); str[++i] = in.nextLine(); } String[] arr = new String[num]; int j = 0 ; for ( int i= 0 ; i<num* 2 ; i++){ arr[j] = Max(str[i], str[++i]); if (arr[j] == null ){ System.out.println( 0 ); } else { System.out.println(arr[j].length()); } j++; } } } |
六、题目六
题目描述
找出一个字符串中连续出现次数最多且长度最长的的子串,,输出该字符串并输出该字字符串出现的次数。
示例
输入:abcabcabcde
输出:abc,3
输入:yyabcdabjcabceg
输出:ab,3
输入:abcab
输出:ab,2
输入:abcabd
输出:ab,2
输入:abcdabcdabcdabcdefg
输出:abcd,4
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | public class HelloWorld { public static HashMap<String,String> CalcMostSubStr(String mainStr){ HashMap<String,String> resultMap = new HashMap<String,String>(); int len = mainStr.length(); int maxCounts = 1 ; int counts = 1 ; String maxSubStr = "" ; //abcabcabcde,yyabcdabjcabceg,abcab,abcabd,abcdabcdabcdefg for ( int i = 0 ; i < len; i++) { //从第一个后缀数组开始 for ( int k=len;k>i;k--){ String subOne = mainStr.substring(i,k); //0,6;0,5;0,4;0,3;0,2,0,1;1,6,1,5,1,4 counts = 1 ; for ( int j=k;j<=len-k;j++){ String subTwo = mainStr.substring(j,k-i+j); //1,6;/1,5,2,6/1,4;2,5;3,6 if (subOne.equals(subTwo)){ counts++; } } //if(subOne.length()>maxSubStr.length()&&counts>maxCounts){ if (counts>maxCounts){ maxCounts = counts; maxSubStr = subOne; } } } resultMap.put( "maxSubStr" ,maxSubStr); resultMap.put( "maxCounts" ,String.valueOf(maxCounts)); return resultMap; } public static void main(String[] args) { while ( true ) { System.out.println( "请输入给定的字符串!" ); Scanner input = new Scanner(System.in); String Str = input.nextLine(); Calendar calendar= Calendar.getInstance(); SimpleDateFormat dateFormat= new SimpleDateFormat( "yyyy-MM-dd :hh:mm:ss:SSS" ); System.out.println( "开始计算时间:" +dateFormat.format(calendar.getTime())); HashMap<String,String> resultMap = CalcMostSubStr(Str); System.out.println(resultMap.get( "maxSubStr" ));; System.out.println(resultMap.get( "maxCounts" ));; dateFormat= new SimpleDateFormat( "yyyy-MM-dd :hh:mm:ss:SSS" ); System.out.println( "结束计算时间:" +dateFormat.format(calendar.getTime())); } } } |
各位朋友可以试试自己在不借助网络的情况下,完成上述这些题分别需要多长时间,是否可以拿到这35万元的年薪,欢迎大家在留言区,留下你更好的实现方法及完成时间。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?