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

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))

maxLenStr = tempStr;

}

}

if(maxEnd==charString.length-1){//最后一次遍历,并且

if(maxLenStr.length()==1){

if((int)(charString[charString.length-1])

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!(说明:不需要考虑负数)

实现代码如下

public class CalcFunc {

public static String MaxLenDigitString(String str){

String maxLenDigitStr = "";

int begin = 0,end = 0;

String tempStr = "";

for(int i=0;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的输出就完事了

实现代码

public class CalcFunc{

public static String GetRepeatCharByASCII(String str){

String maxLenDigitStr = "";

StringBuffer buf=new StringBuffer();

char[] chars = str.toCharArray();

TreeMap map = new TreeMap();

for(int i=0;i

if(!map.containsKey(chars[i]))

map.put(chars[i], 1);

else

map.put(chars[i],map.get(chars[i])+1);

Iterator 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。

解题思路

比较当前字符与前一个字符是否相等,如果相等就删除前一个字符,不相等则直接向下遍历

实现代码

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

代码实现

public class HelloWorld {

public static String GetRepeatChar(String str){

String maxLenDigitStr = "";

StringBuffer buf=new StringBuffer();

char[] chars = str.toCharArray();

TreeMap map = new TreeMap();

for(int i=0;i

if(!map.containsKey(chars[i]))

map.put(chars[i], 1);

else

map.put(chars[i],map.get(chars[i])+1);

Iterator 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

解题思路

找到较短的字符串,然后从中依次取子串,这个依次取子串有点讲究,要先取最长的然后慢慢减短,这使得如果找到就是最长的公共子串;在将子串依次与较长的字符串比较,如果包含则为最长公共子串

代码实现

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

str[i] = in.nextLine();

str[++i] = in.nextLine();

}

String[] arr = new String[num];

int j =0;

for(int i=0; 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

代码实现

public class HelloWorld {

public static HashMap CalcMostSubStr(String mainStr){

HashMap resultMap = new HashMap();

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 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万元的年薪,欢迎大家在留言区,留下你更好的实现方法及完成时间。

华为java机试题限时多久_年薪35万的华为机试题,你完成需要多长时间?相关推荐

  1. 21届校招应届生Offer薪资曝光!年薪35万+,严重倒挂老员工是互联网行业常态?...

    点击上方"码农突围",马上关注 这里是码农充电第一站,回复"666",获取一份专属大礼包 真爱,请设置"星标"或点个"在看&quo ...

  2. 知乎热议:21 届校招应届生 Offer 薪资曝光,年薪 35 万+,严重倒挂老员工是互联网行业常态?...

    点击上方"五分钟学算法",选择"星标"公众号 重磅干货,第一时间送达 杨净 贾浩楠 发自 凹非寺 量子位 报道 | 公众号 QbitAI 一开始,还以为是科技互 ...

  3. 校招年薪35万+,严重倒挂老员工是互联网行业常态?

    杨净 贾浩楠 发自 凹非寺 量子位 报道 | 公众号 QbitAI 一开始,还以为是科技互联网公司招聘的新把式. 因为就在最近,一张美团应届生薪资的截图,在各大社区和校招群里火了. 仅仅算法岗.开发岗 ...

  4. 21届校招应届生Offer薪资曝光:年薪35万+,严重倒挂老员工是互联网行业常态?...

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 杨净 贾浩楠 发自 凹非寺  量子位 报道 | 公众号 QbitAI 一开始,还以为是科技互联网公司招 ...

  5. java开发如何年薪30万_这位Java工程师,5年突破年薪30万,是如何做到的?

    5年突破年薪30万,这位java工程师就在你的身边,可能是你的朋友,也可能就是你.Java工程师的薪资待遇与所处的领域和自身的岗位有较大的关系,对于Java工程师来说,要想在较短的时间内提升自己的薪资 ...

  6. 年薪201万的华为“天才少年”曾是三本复读生,逆袭就是抓住每一次提升自己的机会 | AI大赛报名开启

    当我们看到"华为最高档天才少年年薪201万的话题"冲上热搜时,大多数人一辈子也无法企及的数字让我们羡慕不已.而入选的大部分是计算机.软件工程.模式识别与智能系统专业,尽管我们知道这 ...

  7. 年薪201万的华为“天才少年”曾是三本复读生,逆袭就是抓住每一次提升自己的机会

    当我们看到"华为最高档天才少年年薪201万的话题"冲上热搜时,大多数人一辈子也无法企及的数字让我们羡慕不已.而入选的大部分是计算机.软件工程.模式识别与智能系统专业,尽管我们知道这 ...

  8. python免费开源工具推荐_年薪200万的程序员,推荐这10大Python免费开源工具!

    原标题:年薪200万的程序员,推荐这10大Python免费开源工具! 毫无疑问,Python是最流行的语言之一,其成功的原因之一是它为科学计算提供了广泛的报道. 在这里,我们仔细研究用于机器学习和数据 ...

  9. 大厂程序员年薪_年薪25万一线大厂程序员,年薪10万三线城市大专讲师,怎么选...

    分享亲子快乐,交流教育知识,欢迎关注晓安说教育 有网友在论坛发帖说,目前有两个职业方向可以选择,一个是一线大厂的程序员,年薪25万左右,另一个是三线城市大专院校讲师,年薪大约是10万.问大家该怎么选. ...

最新文章

  1. php excel 追加写入,phpexcel写入追加已有的excel文件
  2. 利用RGB-D数据进行人体检测 带dataset
  3. 201621123028《Java程序设计》第一周学习总结
  4. 【Python】原创 | 写一个符合人类思维的四舍五入函数(No round !!!)
  5. android菜鸟学习笔记27----Fragment的简单使用
  6. java public 继承_java继承问题
  7. java查询线程状态命令_JAVA 线程死锁,以及linux 命令和jstack 命令 查看线程死锁状态信息...
  8. window 创建python虚拟环境
  9. 九度oj 题目1028:继续畅通工程
  10. JAVA实现的吸血鬼数字算法,高效率版本(已有网友给出算法说明)
  11. java int 转换成byte_Java如何将int转换为byte?
  12. sqlalchemy.exc.ProgrammingError: (pymysql.err.ProgrammingError) (1064, “You have an error in your SQ
  13. Android Material Design 系列之 BottomNavigationView + ViewPager + Fragment + BadgeView 开发详解
  14. video视频设置第一帧为封面
  15. 2022电大国家开放大学网上形考任务-矿井测量非免费(非答案)
  16. Java基础篇(集合)
  17. Good Vegetable 4级算法题 分值: [320/3120] 问题: [8/78]
  18. 大数据舞台中的Flink
  19. JPA教程(第五章)
  20. Linux clamav杀毒

热门文章

  1. msvcp140.dll是什么?怎么解决电脑提示msvcp140.dll丢失的问题?(分享解决方法)
  2. 从mongodb移除分片
  3. 虚幻引擎(UE4)编辑器窗口快捷键整理
  4. HTML前端接收JSON数据
  5. Linux命令--记忆宫殿( 初版--自我记忆 )
  6. G1收集器:CPU与Worker线程的关系及一次实际排查案例
  7. PHOTOSHOP(PS)快捷键大全
  8. Lua与c++交互实战基础篇-夏曹俊-专题视频课程
  9. 洛谷P1595 信封问题
  10. 企业如何开展新闻营销工作?