题解 | #在字符串中找出连续最长的数字串#
在字符串中找出连续最长的数字串
http://www.nowcoder.com/practice/2c81f88ecd5a4cc395b5308a99afbbec
两个逻辑清晰明了,没啥难理解的,O(n)复杂度
第一是找到中最常数字的长度,遍历一遍就出来了,打擂台,可作为解题模板
第二就是再遍历一遍获取长度为最大值的子串,并判断子串中是否含有字母,如果含有,则添加进结果中,时间复杂度O(n)
import java.util.Scanner;
/**
* @author
* 输入一个 int 型的正整数,计算出该 int 型数据在内存中存储时 1 的个数。
*
* 数据范围:保证在 32 位整型数字范围内
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String string = sc.nextLine();
doSearch(string);
}
}
public static void doSearch(String string){
int n = 0;//计数变量
int maxOne = 0;
// 遍历一遍获取长度最大值,时间复杂度O(n)
for(int i=0; i < string.length(); i++){
if(Character.isLetter(string.charAt(i))){
n = 0;
}
if(Character.isDigit(string.charAt(i))){
n++;
maxOne = Integer.max(maxOne,n);
}
}
// 再遍历一遍获取长度为最大值的子串,并判断子串中是否含有字母,时间复杂度O(n)
// a123 a12 123 subString(0,2) subString(1,3)
StringBuilder sb = new StringBuilder(); //
String str;
for(int i=0; i <= string.length() - maxOne; i ++){
str = string.substring(i, i + maxOne);
boolean flag = false;
for (int j = 0; j < maxOne; j++) {
if (Character.isLetter(str.charAt(j))){// 这里重复判断,可以优化
flag = true;
}
}
if(flag == false){
sb.append(str);
}
}
System.out.println(sb+","+ maxOne);
}
}