赞
踩
最近一个朋友通过了华为的面试,需要去参加华为机试,具体什么岗位我就不说了,说年薪可以达到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));
- }
- }

在做完上述题目以后,通过百度搜索了一下华为的机试题,发现还有其他类似的机试题,下面是我整理的几道机试题及实现方式。
在字符串中找出连续最长的数字串,并把这个串的长度返回。如果存在长度相同的连续数字串,返回最后一个连续数字串。
遍历该字符串每一个字符,判断当前字符是否为数字(可
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。