今天参加小米二面,面试官让手撕一道算法题,感觉这道算法题挺有意义的,所以还是分享出来。题目如下
这道题目的思路可能会很简单,但是里面的细节可能会要重视一下,我自己写的代码如下,代码能够全部通过。话不多说,直接上代码。
public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); String s = sc.nextLine(); String sb =""; //StringBuilder sb = new StringBuilder(); StringBuilder sb1 = new StringBuilder(); char[] ch = s.toCharArray(); for(int i = 0;i<ch.length;i++){ if(ch[i]>='0' && ch[i]<='9'){ sb1.append(ch[i]); }else{ if(sb1.length()>sb.length()){ sb = sb1.toString(); } sb1.delete(0, sb1.length()); } if(i == ch.length -1 && sb1.length()>0){ if(sb1.length()>sb.length()){ sb = sb1.toString(); } } } System.out.println(sb); }
我刚开始是定义了两个StringBuilder,但是如果我sb = sb1的时候,存在一个引用的问题,浅拷贝可能会导致sb的值为null,所以采用的是一个String,一个StringBuilder来进行计算。还有一个需要注意的点是当我最后一个字符是数字的时候,如果最后的数字序列是最长的字符序列,当我遍历到最后一个字符的时候,如果是数字的话,并且如果不加if判断的话,会直接跳过返回的是之前的最长的子串,所以最后要加if(i == ch.length -1 && sb1.length()>0){
if(sb1.length()>sb.length()){
sb = sb1.toString();
}
这个判断。其它的思想还是比较简单的。
总结:细节问题要注意。
来源:51CTO
作者:磊助
链接:https://blog.csdn.net/qq_37764098/article/details/100746727