最近一个朋友通过了华为的面试,需要去参加华为机试,具体什么岗位我就不说了,说年薪可以达到35~40万元,当然了,拿这个年薪在华为应该算是一般水平了,但是相比社会上的其他企业,这样的工资还是蛮吸引人的,回来的时候,给我们分享了一下机试的题目。
题目描述
给定一串字符,里面有些字符有连续出现的特点,请寻找这些连续字符串中最长的串,如果最长的串有多个,请输出ascii最小的一串?
测试字符串
321,23322a1,12fffdddaa23
答题要求
答题时间限制在90分钟以内,不可以上网查询,可以使用Java/Python/C#等任何语言实现。
解题思路
从第一个字符开始,遍历循环每一个字符,利用maxBegin和maxEnd来记录当前连续出现的子字符串的起始位置,如果当前字符串长度大于历史最大字符串长度,或者两者长度一样,但当前的字符串ASCII码小于之前的,就要用当前的字符串覆盖历史最长的字符串,这里要注意最后一个字符的边界问题。
当我这个朋友在给我们分享面试题目的时候我还在想,就这么一道题还需要90分钟吗?如果开发环境具备,半个小时肯定搞定,于是晚上回家以后,打开电脑思考编写,果然半个小时没有搞定,折腾了一个小时才搞定,具体代码如下:
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));
}
}
在做完上述题目以后,通过百度搜索了一下华为的机试题,发现还有其他类似的机试题,下面是我整理的几道机试题及实现方式。
一、题目一
题目描述
在字符串中找出连续最长的数字串,并把这个串的长度返回。如果存在长度相同的连续数字串,返回最后一个连续数字串。
解题思路
遍历该字符串每一个字符,判断当前字符是否为数字(可