一、统计字符串中连续相同最大个数
问题描述
编写方法实现统计一个字符串中连续相同的字符中最长的字符及其长度;然后编写程序测试该方法;
public static String countMaxContinusChar(String s);返回String,含最长字符一个及该字符长度
测试程序输入样例:
输入:tzannnnnlmbXXXXXXXbm
输出:X7
运行效果
代码
import java.util.Scanner; public class zy2 { public static void main(String[] args) { Scanner in = new Scanner(System.in); char a = '0'; // 最长字符 int a_len = 0; // 最长连续字符的长度 char b = '0'; // 当前统计的字符 int b_len = 1; // 字符长度 String s = in.next(); // 待统计的字符串 b = s.charAt(0); for (int i = 0; i < s.length(); i++) { if (i == 0 || s.charAt(i) == s.charAt(i - 1)) { b_len++; } else { if (b_len > a_len) { a_len = b_len; a = b; } b_len = 1; b = s.charAt(i); } } if (b_len > a_len) { a_len = b_len; a = b; } System.out.printf("%c%d", a, a_len); } }
二、连续相同数组元素
问题描述
编写程序:提示输入一个方阵的行数,然后随机的在方阵中填入0或1,打印这个矩阵,然后找出整行或整列或对角线都是0或1的行、列和对角线。(课堂作业)
样列:
输入(矩阵的长度):4
输出:
0111
0000
0100
1111
第2行全为0
第4行全为1
主对角线没有相同数字
副对角线没有相同数字
运行效果
代码
import java.util.Scanner; import java.util.Random; public class zy3 { public static void main(String[] args) { Scanner in = new Scanner(System.in); int x = in.nextInt(); // 矩阵的长度 Random r = new Random(); // 1. 生成矩阵 int[][] a = new int[x][x]; for (int i = 0; i < x; i++) { for (int j = 0; j < x; j++) { int t = r.nextInt(); t = t > 0 ? t : -t; a[i][j] = t % 2; } } // 2. 查找行列及对角线 // 2. a. 按行,及按列查找 int[] h_ones = new int[x]; // 行中 1 的个数 int[] l_ones = new int[x]; for (int i = 0; i < x; i++) { for (int j = 0; j < x; j++) { h_ones[i] += a[i][j] == 1 ? 1 : 0; // 行 l_ones[i] += a[j][i] == 1 ? 1 : 0; // 列 } } // 2. b. 按对角线查找 int zj_ones = 0; // 主对角线上 1 的个数 int fj_ones = 0; for (int i = 0; i < x; i++) { zj_ones += a[i][1] == 1 ? 1 : 0; // 主对角线 fj_ones += a[i][x-1-i] == 1 ? 1 : 0; // 次对角线 } // 3. 输出生成的随机矩阵 for (int i = 0; i < x; i++) { for (int j = 0; j < x; j++) { System.out.printf("%d ", a[i][j]); } System.out.println(); } // 4. 输出查找结果 for (int i = 0; i < x; i++) { // 4. a. 行 if (h_ones[i] == x) { System.out.printf("第%d行全是1\n", i + 1); } else if (h_ones[i] == 0) { System.out.printf("第%d行全是0\n", i + 1); } // 4. b. 列 if (l_ones[i] == x) { System.out.printf("第%d列全是1\n", i + 1); } else if (l_ones[i] == 0) { System.out.printf("第%d列全是0\n", i + 1); } } // 4. c. 对角线 System.out.println(zj_ones == x ? "主对角线全是1" : (zj_ones == 0 ? "主对角线全是0" : "主对角线没有相同数字")); System.out.println(fj_ones == x ? "副对角线全是1" : (fj_ones == 0 ? "副对角线全是0" : "副对角线没有相同数字")); } }
起初我还每行、列、对角线分别统计了 1 和 0 的出现次数,但后面发现只需统计其中之一就可以了。例如,一行中 1 出现次数与 0 出现次数的和,就是二维数组的“边长”。
三目运算符<条件> ? <值1> : <值2>
挺好用的,相比if-else
有时更加精简一些。