今天參加小米二面,面試官讓手撕一道算法題,感覺這道算法題挺有意義的,所以還是分享出來。題目如下
這道題目的思路可能會很簡單,但是裏面的細節可能會要重視一下,我自己寫的代碼如下,代碼能夠全部通過。話不多說,直接上代碼。
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();
}
這個判斷。其它的思想還是比較簡單的。
總結:細節問題要注意。