【java作业2】统计字符串中连续相同最大个数 & 连续相同数组元素

一、统计字符串中连续相同最大个数

问题描述

编写方法实现统计一个字符串中连续相同的字符中最长的字符及其长度;然后编写程序测试该方法;

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有时更加精简一些。


猜你喜欢

转载自blog.csdn.net/m0_63238256/article/details/129508483