顺风2018秋招笔试题
程序员文章站
2022-06-09 10:50:17
...
对称主义者小A定义了一种“双节棍字符串”:形式如同aa…bb…cc…,其中字符a的个数等于字符c的个数,
字符b的个数小于他们的个数。例如aaabccc,AACMM。给你一个字符串,输出该字符串的最长双节棍子串,
若没有则输出NULL,若有多个则输出最靠前的一个。输入字符串的最长有1000000个字符。
public class Sontest {
public static String getString(String str) {
/*
思路:
1.将字符串转换为字符数组,方便读取判断当中的内容
2.在循环中找内容,如果和上一个相同则计数count+1,如果是计数最大值(说明数量最多),则赋值给maxNun保存,并且将该字符在字符串中的index(第一次出现的位置)保存;
3.如果i+1 != i,则进行count初始化1,然后继续上述操作
4.最后在对i=length-1时,i与i-1的情况进行判断
*/
//用来计相同字符的个数
int count = 1;
//用来保存最大字符个数
int maxNum = 0;
//获取字符数组的长度
int length = str.length();
//将字符串转换为字符数组,用于字符比较
char[] arr = str.toCharArray();
//用来保存截取的字符串
String newStr = "";
if (str.length() == 0) {
System.out.println("NULL");
} else if (str.length() < 1000000) {
//用来记录当前字符的位置
int index = 0;
//i<length-1而不是<=是因为 1.我的count初始值已经是1而不是0开始的,2.我是用i和i+1进行的比较
for (int i = 0; i < length - 1; i++) {
//相等则加1
if (String.valueOf(arr[i]).equals(String.valueOf(arr[i + 1]))) {
count++;
//如果count计数比最大记录数大
if (count != 1 && count > maxNum) {
//获取当前索引位置
index = str.indexOf(arr[i]);
maxNum = count;
}
} else {
//当两者不相等时,初始化count,进行下一次循环比较
count = 1;
}
}
//substring(0,2)表示从索引0截取到索引2
newStr = str.substring(index, index + maxNum);
}
return newStr;
}
public static void main(String[] args) {
String t = "ssssdddaa";
String t1 = "sssdddaa";
String t2 = "ssssdddddaa";
String t3 = "ssssdddaaaaaaaa";
System.out.println(getString(t));
System.out.println(getString(t1));
System.out.println(getString(t2));
System.out.println(getString(t3));
}
}
输出结果:
ssss
sss
ddddd
aaaaa
Process finished with exit code 0
可能还有些许不全面的部分,但是具体思路是这样的,如果有不同的或错误的谢谢提出。
上一篇: 程序人生、钓鱼人生—我的三年程序经验分享