zoukankan      html  css  js  c++  java
  • 年薪35万的华为机试题,你完成需要多长时间?

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

        在做完上述题目以后,通过百度搜索了一下华为的机试题,发现还有其他类似的机试题,下面是我整理的几道机试题及实现方式。

    一、题目一

    题目描述

      在字符串中找出连续最长的数字串,并把这个串的长度返回。如果存在长度相同的连续数字串,返回最后一个连续数字串。

    解题思路

      遍历该字符串每一个字符,判断当前字符是否为数字(可以通过获取该字符的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<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的输出就完事了

    实现代码

    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。

    解题思路

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

    实现代码

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

    解题思路

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

    代码实现

    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

    代码实现

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

     

  • 相关阅读:
    Android 序列化 反序列功能
    Android两个应用之间共享数据之SharedPrefence
    利用Asp.Net的Identity控制登录权限
    基元类型
    CLR概述
    python中的函数-基础
    较为复杂的sql
    oracle中的替换字段字符串的方法
    使用Sql查看表对应的外键关系。
    js中的除法
  • 原文地址:https://www.cnblogs.com/doubleicon/p/12732430.html
Copyright © 2011-2022 走看看