写了半天发现这题主要在于怎么取数
1、一开始以为是从i = 0开始遍历到s.length() - 10,每十个为一组比较,但显然这样是不合题意的,对于第一组数会输出AAACCCCCAA这样的字符串,对于第二组会输出多个AAAAAAAAAA
2、观察题目,又觉得是当遇到不同的字符,将之后的十个字符输出。这样对于第一组来说是可以取到前两个字符串,但当如下情况时,发现仍是不合题意的
3、对于此序列来说,如果i循环到第16位,则向后移一位
对于普适性的序列来说,没找出来规律
其他想法
或许可以把一整个长字符串按排列顺序拆分成相同字符的不同的组,输出时取相同的字符
代码及解析
import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput; import java.util.Scanner; public class HomeWork017 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); while (scan.hasNextLine()) { String s = scan.nextLine(); HomeWork017 h = new HomeWork017(); h.getIndex(s); } scan.close(); } void getIndex(String str) { char arr[][] = new char[str.length()][10]; int q = 0; for (int i = 0; i < str.length() - 10; i++) { //转化成二维数组 if(i == 0){ str.getChars(i, i + 10, arr[q], 0); }else if(str.charAt(i - 1) != str.charAt(i)) { str.getChars(i, i + 10, arr[++q], 0); }else if(i == 16){ str.getChars(i, i + 10, arr[q], 0); } } int num = 0; for(int i = 0;i < str.length();i++){ if(arr[i][0] != 0){ num++; } } //循环傻了 //问题:当一组i和x之间还有一组i1和x1,那么x1的数据会替换m int n = 0; int m[] = new int[10]; //把x存储的数给数组 for (int i = 0; i < 10; i++) { //避免异常跳出循环 m[i] = -1; } in: for (int i = 0; i < num; i++) { for (int p = 0; p <= n; p++) { //遍历数组,避免遍历到对应的x行数组 if (i == m[p]) { continue in; } } out: for (int x = i + 1; x < num; x++) { for (int j = 0; j < 10; j++) { if (arr[i][j] != arr[x][j]) { continue out; //换下一行 } if (j == 9) { //找到完全相同的行 for (int k = 0; k < 10; k++) { System.out.print(arr[i][k]); //遍历输出第i行的数组 } m[n++] = x; //同时需要避免下一次遍历到x行数组 System.out.print("\t"); continue in; //找到一组就不用再寻找接下来的数组是否与这组相同,跳过x循环,执行i循环的下一组 } } } } } }
最后,不会写,代码改着改着只能跑第一组了