Java基础 - 代码练习

news2024/11/16 5:53:46

第一题:集合的运用(幸存者)

public class demo1 {
    public static void main(String[] args) {
        ArrayList<Integer> array = new ArrayList<>();  //一百个囚犯存放在array集合中
        Random r = new Random();
        for (int i = 0; i < 100; i++) {
            OUT:
            while (true) {
                int n = r.nextInt(200)+1;  //生成随机数1-200
                //用for循环对比有没有重复比较复杂
//                for (int j = 0; j < i; j++) {
//                    if(n==array.get(j)){  //随机数重复
//                        continue OUT;
//                    }
//                }
                if(array.contains(n)){  //随机数重复
                    continue OUT;
                }
                //说明没有重复的
                array.add(n);
                break OUT;
            }
        }
        System.out.println(array);

        ArrayList<Integer> arr = new ArrayList<>(); //保存一百个囚犯第一次的存放位置
        arr.addAll(array);
        System.out.println(arr);

        //题中要求位置从1开始计数,现在我们的位置是从0开始,所以后续计算要+1
        while(array.size()>1){
            for (int i = array.size()-1; i>=0; i--) {
                if((i+1)%2==1){  //奇数位置
                    array.remove(i);
                }
            }
            System.out.println(array);
        }

        System.out.println("幸存者编号:" + array.get(0));
        System.out.print("幸存者第一次所占的位置(从1开始算):");
        System.out.print(arr.indexOf(array.get(0)) + 1);
    }
}

第二题:基础编程能力

//User
public class User {
    private Long id; //用户id
    private String name; //用户名
    private String gender; //用户性别
    private LocalDate birthday; //用户生日

    public User() {
    }

    public User(Long id, String name, String gender, LocalDate birthday) {
        this.id = id;
        this.name = name;
        this.gender = gender;
        this.birthday = birthday;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public LocalDate getBirthday() {
        return birthday;
    }

    public void setBirthday(LocalDate birthday) {
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", birthday=" + birthday +
                '}';
    }
}

//demo2
public class demo2 {
    public static void main(String[] args) {
        //创建一个ArrayList集合
        List<User> users = new ArrayList<>();

        //解析字符串
        String userStrs = "10001:张三:男:1990-01-01#10002:李四:女:1989-01-09#10003:王五:男:1999-09-09#10004:刘备:男:1899-01-01#10005:孙悟空:男:1900-01-01#10006:张三:女:1999-01-01#10007:刘备:女:1999-01-01#10008:张三:女:2003-07-01#10009:猪八戒:男:1900-01-01";
        String[] strs = userStrs.split("#"); //用#号把每个用户的数据先拆分开
        //System.out.println(Arrays.toString(strs)); //[10001:张三:男:1990-01-01, 10002:李四:女:1989-01-09, 10003:王五:男:1999-09-09, 10004:刘备:男:1899-01-01, 10005:孙悟空:男:1900-01-01, 10006:张三:女:1999-01-01, 10007:刘备:女:1999-01-01, 10008:张三:女:2003-07-01, 10009:猪八戒:男:1900-01-01]

        for (int i = 0; i < strs.length; i++) {
            String s = strs[i];
            String[] str2 = s.split(":");  //用:号把每个用户的个人数据(id 姓名 性别 生日)拆分开
            //str2[0]代表id  str2[1]代表姓名  str2[2]代表性别  str2[3]代表生日

            long id = Long.parseLong(str2[0]); //把用户id从String型转换成long型
            //long id = Long.valueOf(str2[0]); //把用户id从String型转换成long型

            //把生日转换成从字符串转换成LocalDate
            LocalDate birth = LocalDate.parse(str2[3]);
//            String[] time = str2[3].split("-"); //time[0]代表年 time[1]代表月 time[2]代表日
//            int year = Integer.parseInt(time[0]);
//            int month = Integer.parseInt(time[1]);
//            int day = Integer.parseInt(time[2]);
//            LocalDate birth = LocalDate.of(year,month,day);

            User user = new User(id,str2[1],str2[2],birth);
            users.add(user);
        }

        System.out.println(users);

        System.out.println("============================================");

        //遍历List<User>集合,统计每个名字出现的次数
        Map<String,Integer> map = new HashMap<>();
        for (int i = 0; i < users.size(); i++) {
            User user = users.get(i);
            if(map.containsKey(user.getName())){ //如果用户的名字在map的键中存在
                map.put(user.getName(),map.get(user.getName())+1);
            }else{ //如果用户的名字在map的键中第一次出现
                map.put(user.getName(),1);
            }
        }
        //System.out.println(map);
        map.forEach((k,v) -> System.out.println(k+":"+v+"次"));
    }
}

第三题:JDK8新时间的应用

public class demo3 {
    public static void main(String[] args) {
        LocalDate ld = LocalDate.of(2022,2,3); //记录首次休息日
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入您查询月份(XXXX-X):");
            String s = sc.next();
            if(!s.matches("\\d{4}-\\d{1,2}")){
                System.out.println("您输入的时间格式不正确,请重新输入");
                continue;
            }else {
                String[] str = s.split("-");
                int year = Integer.parseInt(str[0]); //查询的年份
                int month = Integer.parseInt(str[1]); //查询的月份呢
                if(month > 12 || month < 1){ //查询的月份不是1-12之间
                    System.out.println("请输入正确的月份(1-12)~~~");
                }else if (year < 2022 || (year == 22 && month <= 2)) {  //查询月份不在2022年2月之后
                    System.out.println("请输入2022年2月之后的月份~~~");
                } else { //查询月份在2022年2月之后 且 月份符合规范(1-12)
                    int days = dayNum(year, month); //该月有几天
                    //打印该月的上班情况
                    for (int i = 1; i < days; i++) {
                        LocalDate date = LocalDate.of(year, month, i);
                        //判断该日是否是休息日
                        Long next = date.toEpochDay() - ld.toEpochDay();  //获取相差天数
                        if (next % 3 == 0) {
                            System.out.print(date + "[休息]");
                            //判断休息日是否是周末(周六 周日)
                            if(date.getDayOfWeek() == DayOfWeek.SATURDAY){
                                System.out.print("[周六] ");
                            }else if(date.getDayOfWeek() == DayOfWeek.SUNDAY){
                                System.out.println("[周日] ");
                            }else{
                                System.out.print(" ");
                            }
                        } else if (next % 3 == 1 || next % 3 == 2) {
                            System.out.print(date + " ");
                        }
                    }
                    break;
                }
            }
        }
    }

    public static int dayNum(int year, int month) {
        int num = 0;
        switch (month){
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                num = 31;
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                num = 30;
                break;
            case 2:
                if((year%4==0 && year%100!=0) || (year%400==0)){
                    //闰年
                    num = 29;
                }else{
                    num = 28;
                }
                break;
            default:
                System.out.println("月份有误");
                break;
        }
        return num;
    }
}

第四题:手写ArrayList集合

//MyArrayList
public class MyArrayList<E> {
    private Object[] arr = new Object[10];
    private int count = 0; //记录数组中现存有几个数据
    private double gene = 0.8; //激活因子

    //往集合中添加数据(返回值是boolean类型)
    public boolean add(E e){
        arr[count] = e;
        count++;
        if(count >= arr.length * gene){
            Object[] arr1 = Arrays.copyOf(arr,arr.length * 2); //如果数组中的数据个数等于或超过数组最大范围的80%,则扩容两倍
            arr = arr1;
        }
        //System.out.println(Arrays.toString(arr));
        //但是由于用户只是当成集合,应该设计成看不到最后扩容的null值位
        //比如用户存入第一个数据11,用户希望返回的是[11],不是[11,null,null…]
//        Object[] rs = Arrays.copyOf(arr,count);
//        System.out.println(Arrays.toString(rs));

        return true;
    }

    //根据索引查询指定元素
    public E get(int index) {
        //但是由于用户只是当成集合,应该设计成看不到最后扩容的null值位
        //比如用户存入第一个数据11,用户希望返回的是[11],不是[11,null,null…]
        //因此用户输入超过他自己存入个数的索引值,就产生了越界
        if(index >= count || index < 0){ //索引值越界
            throw new ArrayOutException("您输入的索引越界");
        }else{
            return (E) arr[index];
        }
    }

    //根据索引删除指定元素(返回值是被删除的元素)
    public E remove(int index){
        if(index >= count || index < 0) { //索引值越界
            throw new ArrayOutException("您输入的索引越界");
        }else{
            E e = (E) arr[index]; //记录被删除元素
            //删除的元素是最后一个元素
            if(index == arr.length-1){  //由于扩容机制,所以不会删除的元素永远不会是数组的最后一个
                arr[index] = null;
                return e;
            }
            //删除的元素不是最后一个元素,需要进行移位(后面的数前移)
            for (int i = index + 1; i < arr.length; i++) {
                if(i != arr.length-1){
                    arr[i-1] = arr[i];
                }else{
                    arr[i] = null;   //由于扩容机制,永远都没有存满,最后一位永远是null,因此最后一个数的前移不会导致最后一位多出来一个重复的数
                }
            }
            //System.out.println(Arrays.toString(arr));
            count--; //数组元素个数-1
            //但是由于用户只是当成集合,应该设计成看不到最后扩容的null值位
            //比如用户存入第一个数据11,用户希望返回的是[11],不是[11,null,null…]
//            Object[] rs = Arrays.copyOf(arr,count);
//            System.out.println(Arrays.toString(rs));

            return e;
        }
    }

    //返回集合大小
    public int size(){
        return count;
    }

    //遍历集合
    public void forEach1(){
        for (int i = 0; i < count; i++) {
            System.out.print(arr[i]+ " ");
        }
        System.out.println();
    }

    //遍历集合(可以用Lambda表达式)
    public void forEach(MyConsumer<E> action){
        Objects.requireNonNull(action);
        for (int i = 0; i < count; i++) {
            action.accept((E) arr[i]);
        }
    }

    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        for (int i = 0; i < count; i++) {
            E e = (E) arr[i];
            sb.append(e).append(i==count-1?"":", "); //判断该元素是否是最后一个数据,是否需要加,
        }
        sb.append("]");
        return sb.toString();
    }
}

//MyConsumer
public interface MyConsumer<E> {
    void accept(E e);
}

//ArrayOutException
public class ArrayOutException extends RuntimeException{
    public ArrayOutException(){

    }
    public ArrayOutException(String message){
        super(message);
    }
}

//demo4
public class demo4 {
    public static void main(String[] args) {
        MyArrayList<Integer> arr = new MyArrayList<>();
        arr.add(11);
        arr.add(22);
        arr.add(33);
        arr.add(44);
        arr.add(55);
        arr.add(66);
        arr.add(77);
        arr.add(88);
        arr.add(99);

        System.out.println(arr); //[11, 22, 33, 44, 55, 66, 77, 88, 99]
        System.out.println(arr.size()); //集合大小 9

        System.out.println(arr.get(8)); //索引8是99
        //System.out.println(arr.get(11)); //您输入的索引越界
        //System.out.println(arr.get(-1)); //您输入的索引越界

        System.out.println(arr.remove(7)); //返回被删除的元素88

        System.out.println(arr.size()); //集合大小 8

        arr.forEach1(); //11 22 33 44 55 66 77 99

        arr.forEach((Integer integer) -> System.out.print(integer + " ")); //11 22 33 44 55 66 77 99
    }
}

第五题:二分查找的应用

public class demo5 {
    public static void main(String[] args) {
        int[] nums = {};
        int target = 0;
        int[] rs = isExist(nums,target);
        System.out.println(Arrays.toString(rs));
    }

    //查找目标值对应的最左边的位置
    public static int getLeftIndex(int[] nums, int target){
        int rs = -1; //数据不存在为-1
        //二分查找
        int left = 0;
        int right = nums.length-1;
        while (left<=right){
            int middle = (left + right) / 2;
            if(nums[middle]==target){
                rs = middle; //先临时存放第一次找到目标值的位置
                //二分查找该元素的 左边 是否还存在目标值
                right = middle - 1;
            }else if(nums[middle] < target){
                left = middle + 1;
            }else if(nums[middle] > target){
                right = middle - 1;
            }
        }
        return rs;
    }

    //查找目标值对应的最右边的位置
    public static int getRightIndex(int[] nums, int target){
        int rs = -1; //数据不存在为-1
        //二分查找
        int left = 0;
        int right = nums.length-1;
        while (left<=right){
            int middle = (left + right) / 2;
            if(nums[middle]==target){
                rs = middle; //先临时存放第一次找到目标值的位置
                //二分查找该元素的 右边 是否还存在目标值
                left = middle + 1;
            }else if(nums[middle] < target){
                left = middle + 1;
            }else if(nums[middle] > target){
                right = middle - 1;
            }
        }
        return rs;
    }

    //复杂度O(log2n)
    public static int[] isExist(int[] nums, int target) {
        int[] rs = {-1,-1}; //记录返回值
        if(nums == null ||nums.length == 0){ //如果 数组不存在 或 数组为空
            return rs;
        }
        //数组不为空
        rs[0] = getLeftIndex(nums,target);
        rs[1] = getRightIndex(nums,target);
        return rs;
    }

    //复杂度O(n)
    public static int[] isExist1(int[] nums, int target) {
        int[] rs = new int[2];
        int count = 0; //记录第几次找到该数字
        for (int i = 0; i < nums.length; i++) {
            if(nums[i] == target && count == 0){ //第一次找到该数字
                rs[0] = i;
                count++;
            }else if(nums[i] == target && count != 0){ //不是第一次找到该数字
                rs[1] = i;
                count++;
            }
        }
        if(count == 0){ //说明未找到
            rs[0] = -1;
            rs[1] = -1;
        }
        return rs;
    }
}

第六题:手写链表、反转链表

//MyLinkedList
public class MyLinkedList<E> {
    private int size;
    /**
     * 定义了一个私有的内部类,作为链表的结点
     */
    public static class Node<E>{
        E data;
        Node<E> next;

        public Node(E data, Node<E> next) {
            this.data = data;
            this.next = next;
        }
    }

    public Node<E> add(){
        Node<E> head = null;
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请您输入当前结点的数据值(exit为结束):");
            String data = sc.next();
            if(data.equals("exit")){ //如果输入的是exit则结束
                break;
            }
            //输入不是exit
            if(head==null){ //第一次创建结点
                head = new Node(data,null);
                size++;
            }else{
                //已存在头结点,往后插入结点(尾插法)
                Node<E> temp = head;
                //让temp走到尾部
                while(temp.next != null){
                    temp = temp.next;
                }
                //把当前结点值创建出来,加入尾部
                temp.next = new Node(data,null);
                size++;
            }
        }
        return head; //返回链表是返回链表的头结点
    }

    public Node<E> reverse(Node<E> head,int left,int right){
        if(head == null || left < 1 || left > size || right < 1 || right > size || left >= right){
            return head;
        }
        //反转
        //先找到左结点的位置
        //从左结点遍历到右结点,然后把数据存到集合中
        Node<E> first = head; //遍历结点标识
        Node<E> mark = null; //记录左结点
        List<E> data = new ArrayList<>();
        int index = 0;
        while(first != null){
            index++;
            if(index == left){
                mark = first;
            }
            if(index>=left && index<=right){
                data.add(first.data);
            }
            if(index == right){
                break;
            }
            first = first.next;
        }
        
        //倒序遍历集合
        for (int i = data.size()-1; i >= 0; i--) {
            E e = data.get(i);
            mark.data = e;
            mark = mark.next;
        }
        
        return head;
    }

    public void forEach(Node<E> head){
        if(head == null){
            System.out.println(head);
            return;
        }

        while(head != null){
            System.out.print(head.data+" ");
            head = head.next;
        }
        System.out.println();
    }

}

//demo6
public class demo6 {
    public static void main(String[] args) {
        MyLinkedList<String> list = new MyLinkedList<>();
        MyLinkedList.Node<String> head = list.add();
        list.forEach(head);
        MyLinkedList.Node<String> head2 = list.reverse(head,2,5);
        list.forEach(head2);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1568304.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JimuReport 积木报表

一款免费的数据可视化报表&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于 excel 操作风格&#xff0c;通过拖拽完成报表设计…

从零到百万富翁:ChatGPT + Pinterest

原文&#xff1a;Zero to Millionaire Online: ChatGPT Pinterest 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 在社交媒体上赚取百万美元 - 逐步指南&#xff0c;如何在线赚钱版权 献给&#xff1a; 我将这本书&#xff0c;“从零到百万富翁在线&#xff1a;Chat…

【御控物联】JavaScript JSON结构转换(18):数组To对象——多层属性重组

文章目录 一、JSON结构转换是什么&#xff1f;二、案例之《JSON数组 To JSON对象》三、代码实现四、在线转换工具五、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0c;生成新的JS…

基于PHP的校园招聘管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的校园招聘管理系统 一 介绍 此校园招聘管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为个人用户&#xff0c;企业和管理员三种。 技术栈&#xff1a;phpmysqlbootstrapphpstudyvscode 二…

JS——判断节假日(假日包括周末,不包括调休上班的周末)

思路&#xff1a;创建两个数组&#xff0c;数组1为节假日数组&#xff0c;数组2为是周末上班日期数组。如果当前日期&#xff08;或某日期&#xff09;同时满足2个条件&#xff08;1.在节假日数组内或在周末。2.不在周末上班日期数组&#xff09;即为节假日&#xff0c;否则即为…

Mybatis-Plus05(分页插件)

分页插件 MyBatis Plus自带分页插件&#xff0c;只要简单的配置即可实现分页功能 1. 添加配置类 Configuration MapperScan("com.atguigu.mybatisplus.mapper") //可以将主类中的注解移到此处 public class MybatisPlusConfig {Bean public MybatisPlusIntercepto…

LeetCode-105. 从前序与中序遍历序列构造二叉树【树 数组 哈希表 分治 二叉树】

LeetCode-105. 从前序与中序遍历序列构造二叉树【树 数组 哈希表 分治 二叉树】 题目描述&#xff1a;解题思路一&#xff1a;暴力搜索解题思路二&#xff1a;哈希查找解题思路三&#xff1a; 题目描述&#xff1a; 给定两个整数数组 preorder 和 inorder &#xff0c;其中 pr…

通过vite创建项目

一、VUE3官网 Vue.js - 渐进式 JavaScript 框架 | Vue.js (vuejs.org) 二、通过Vite创建项目 1、在cmd窗口下&#xff0c;全局安装vite //使用国内镜像源 npm config set registryhttps://registry.npmmirror.com//安装最新版vite npm install -g vitelatest Vite | 下一代…

Python爬虫——基于JWT的模拟登录爬取实战

基于JWT的模拟登录爬取实战 JWT&#xff08;JSON Web Token&#xff09;主要由三部分组成&#xff1a; Header&#xff1a;包含了Token的类型&#xff08;“typ”&#xff09;和签名算法&#xff08;“alg”&#xff09;信息。通常情况下&#xff0c;这个部分会指定为{"…

ChatGPT 之创造力与沟通的演化

原文&#xff1a;ChatGPT … The Evolution of Creativity and Communication 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 作者注 亲爱的读者&#xff0c; ChatGPT&#xff0c;一位 AI 专家和一位律师走进了一家酒吧。酒保看着他们说&#xff1a;“这是什么&…

企业邮箱给谷歌Gmail报错550-5.7.25解决方案

企业邮箱给谷歌Gmail报错550-5.7.25解决方案 问题表现 今天接到同事报告企业邮箱发送报错的问题&#xff0c;具体问题表现如下&#xff1a; 我司内部邮箱 xxXXX.com 邮箱给国内的163和新浪和企业内部发送邮件可以成功给Hotmail发送邮件&#xff0c;成功。给Gmail发送邮件&am…

java计算机网络(一)-- url,tcp,udp,socket

网络编程&#xff1a; 计算机网络 计算机网络指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统、网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算机系统。 网络协议…

前端工程师————CSS学习

选择器分类 选择器分为基础选择器和复合选择器 基础选择器包括&#xff1a;标签选择器&#xff0c;类选择器&#xff0c;id选择器&#xff0c;通配符选择器标签选择器 类选择器 语法&#xff1a;.类名{属性1&#xff1a; 属性值&#xff1b;} 类名可以随便起 多类名使用方式&am…

华为openEuler-22.03-LTS-SP3配置yum源

先有华为后有天&#xff0c;遥遥领先&#xff01; 1 确定使用的OS版本 # cat /etc/os-release NAME"openEuler" VERSION"22.03 (LTS-SP3)" ID"openEuler" VERSION_ID"22.03" PRETTY_NAME"openEuler 22.03 (LTS-SP3)" ANSI…

深度解析大语言模型中的词向量

在学习完语言模型中的编码器与解码器知识后&#xff0c;让我们继续深入学习大语言模型中一个非常关键的技术&#xff1a;词向量表示&#xff0c;以及如何通过Transformer模型实现对next token的预测。 1、词向量 要了解语言模型的工作原理&#xff0c;首先需要了解它们如何表示…

VSCode美化

今天有空收拾了一下VSCode&#xff0c;页面如下&#xff0c;个人觉得还是挺好看的~~ 1. 主题 Noctis 色彩较多&#xff0c;有种繁杂美。 我使用的是浅色主题的一款Noctis Hibernus 2. 字体 Maple Mono 官网&#xff1a;Maple-Font 我只安装了下图两个字体&#xff0c;使…

UE4_普通贴图制作法线Normal材质

UE4 普通贴图制作法线Normal材质 2021-07-02 10:46 导入一张普通贴图&#xff1a; 搜索节点&#xff1a;NormalFromHeightmap 搜索节点&#xff1a;TextureObjectparameter&#xff0c;并修改成导入的普通贴图&#xff0c;连接至HeightMap中 创建参数normal&#xff0c;连接…

32. UE5 RPG使用增强输入激活GameplayAbility(二)

在上一篇文章中&#xff0c;我们实现了Tag和InputAction的数据对应&#xff0c;后面&#xff0c;我们会通过InputAction触发对应的Tag&#xff0c;然后在GameplayAbility身上设置对应的Tag&#xff0c;然后通过Tag遍历角色身上的所有应用的技能去激活。为了实现这个功能&#x…

数据结构进阶篇 之 【交换排序】(冒泡排序,快速排序递归、非递归实现)

当你觉的自己不行时&#xff0c;你就走到斑马线上&#xff0c;这样你就会成为一个行人 一、交换排序 1.冒泡排序 BubbleSort 1.1 基本思想 1.2 实现原理 1.3 代码实现 1.4 冒泡排序的特性总结 2.快速排序 QuickSort 2.1 基本思想 2.2 递归实现 2.2.1 hoare版 2.2.2 …

蓝桥杯真题:递增序列

import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改 public class Main {public static int is1(char ch[][],int m,int n){int ans0;for (int i0;i<m;i){for (int j0;j<n;j){int add1;while(jadd<n){if(ch[i][j]<ch[i][jadd]) ans; //横…