搞定BAT------算法系列(1)

现在,我怕的并不是那艰苦严峻的生活,而是不能再学习和认识我迫切想了解的世界。对我来说,不学习,毋宁死。——罗蒙诺索夫

题目一

       给定一个字符串str,返回str的统计字符串。例如,“aaabbadddffc”的统计字符串为“a_3_b_2_a_1_d_3_f_2_c_1”。

代码

 public static String getCountString(String str){
        //如果str为空,返回空
        if(str==null || "".equals(str)){
            return "";
        }
        //将字符串转为字符数组
        char[] chs = str.toCharArray();
        //res表示统计字符串,此时只包含str的第0个字符
        String res = String.valueOf(chs[0]);
        //num代表当前字符的数量
        int num=1;
        //从str[1]位置开始,从左到右遍历str
        for(int i=1;i<chs.length;i++){
            //若不相等,说明当前连续出现的字符(str[i-1])已经结束,令res=res+"_"+num+"_"+str[i]
            //在令num=1,继续遍历下一个字符
            if(chs[i] != chs[i-1]){
                res = concat(res,String.valueOf(num),String.valueOf(chs[i]));
                num=1;
            //若相等,说明当前连续出现的字符(str[i-1])还没结束,则令num++
            }else{
                num++;
            }
        }
        //当遍历结束后,最后字符的次数还没与放入res,所以最后令res=res+"_"+num
        return concat(res,String.valueOf(num),"");
    }

    public static String concat(String s1,String s2,String s3){
        return s1+"_"+s2+("".equals(s3) ? s3:"_" +s3);
    }

    public static void main(String[] args){
        String str ="aaabbadddffc";
        System.out.print(getCountString(str));
    }

题目二

        给定一个字符类型数组chas[],判断chas中是否所有的字符都只出现过一次。例如,chas=['a','b','c'],返回true; chas=['1','2','1'] ,返回false。

代码

public  boolean isUnique1(char[] chas){
    //如果是空字符数组,直接返回true
    if(chas == null){
       return true;
    }
    //定义一个布尔型数组map,记录每种字符的出现情况
    boolean map = new boolean[256];
    //遍历chas
    for(int i=0;i<chas.length;i++){
      //多次出现直接返回false
      if(map[chas[i]]){
         return false;
      }
      map[chas[i]]=true;
    }
    return true; 
}

题目三

给定一个数组arr,返回子数组的最大累加和。例如,arr=[1,-2,3,5,-2,6,-1],在所有的子数组中,[3,5,-2,6]可以累加出最大的和12,所以返回12。

代码

pubic int maxSum(int[] arr){
     if(arr==null || arr.length==0){
          return 0;
     }
     //定义max为极小值
     int max = Integer.MIN_VALUE;
     //定义变量cur记录每一步的累加和
     int cur=0;
     //遍历arr
     for(int i=0;i!=arr.length;i++){
         累加
         cur+=arr[i];
         //获取最大值
         max = Math.max(max,cur);
         //当cur<0,说明累加到当前数出现了小于0的结果,那么累加的这一部分肯定不能作为产生最大累加和
         //的子数组的左边部分,此时令cur=0,表示重新从下一个数开始累加。
         cur = cur<0?0:cur;
     }
     return max;
     
}

本篇文章只是列举了三个简单的算法题,后边的算法系列我会逐渐加大题目的难度。

参考资料

《程序员代码面试指南》

=============================================================

猜你喜欢

转载自my.oschina.net/u/3475585/blog/1807045
今日推荐