JAVA牛客入门11~20

JAVA11 求最小公倍数

循环:

复制代码
        //计算m、n中较大者
        int max=Math.max(m,n);
        //从max到m*n之间找最小公倍数
        for(int i=max;i<=m*n;i++){
            //如果既能被m整除又能被n整除,说明是最小公倍数,直接返回
            if(i%m==0&&i%n==0){
                return i;
            }
        }
        return -1;
    }

int max=Math.max(m,n); 与**int max=m>n ? m:n;**等效

JAVA12 小球走过路程计算

复制代码
float sum=0;
for(int i=0;i<n;i++){
    sum+=h;//加上落下的距离
    h=h/2;//弹起距离缩短一半
    if(i==n-1){
    System.out.println(String.format("%.3f", h)+" "+String.format("%.3f", sum));
    }
    sum+=h;//加上弹上去的距离
}

JAVA13 求平均数

复制代码
        double sum=0;
        int n=0,i=0;
        while((i=scan.nextInt())>0){
            sum+=i;
            n++;
            }
            System.out.println(String.format("%.2f",sum/n));

JAVA14 判断质数

Erlang 复制代码
        int c=0;
        for(int i=1;i<number+1;i++){
            if(number%i==0){
                c++;
            }
        }
        return c>2 ? false:true;

精简后:

Erlang 复制代码
        int i=2;
        for(;number%i!=0;i++);
        return i==number ? true:false;

JAVA15 计算整数位数

Erlang 复制代码
        if(num<=0) System.out.print(num);
        int c=0;
        while(num>0){
            num/=10;
            c++;
        }
        System.out.print(c);

JAVA16 数组遍历

复制代码
        min=ary[0];
        max=ary[0];
        for(int i=0;i<ary.length;i++){
            if(ary[i]>max){
                max=ary[i];
            }
            if(ary[i]<min){
                min=ary[i];
            }
        }
        System.out.println(max+" "+min);

        max = ary[0];
        min = ary[0];
        for(int i=0;i<ary.length;i++){
            max=Math.max(ary[i],max);
            min=Math.min(ary[i],min);
        }
        System.out.println(max+" "+min);

1. max = Math.max(ary[i], max);

  • 作用 :从当前数组元素 ary[i] 和当前最大值 max 中,取较大值并更新到 max 变量里。
  • 原理Math.max(a, b) 是 JavaScript 内置方法,接收两个参数,返回其中数值更大的那个。
  • 遍历场景逻辑 :初始化时,max 一般设为 -Infinity(负无穷),这样数组的第一个元素必然会成为初始最大值;后续每遍历一个元素,都和当前 max 比较,把更大的值存进去,最终得到整个数组的最大值。

2. min = Math.min(ary[i], min);

  • 作用 :从当前数组元素 ary[i] 和当前最小值 min 中,取较小值并更新到 min 变量里。
  • 原理Math.min(a, b)Math.max 正好相反,接收两个参数,返回其中数值更小的那个。
  • 遍历场景逻辑 :初始化时,min 一般设为 Infinity(正无穷),这样数组的第一个元素必然会成为初始最小值;后续每遍历一个元素,都和当前 min 比较,把更小的值存进去,最终得到整个数组的最小值。

JAVA17 数组倒转

复制代码
        int i=0,t;
        while(i<arr.length/2){
            t=arr[i];
            arr[i]=arr[arr.length-1-i];
            arr[arr.length-1-i]=t;
            i++;
        }

        int left=0,right=arr.length-1;
        while(left<right){
            int temp=arr[left];
            arr[left]=arr[right];
            arr[right]=temp;
            left++;
            right--;
        }

JAVA18 二维数组求和

复制代码
        for(int i=0;i<arr.length;i++){
            for(int j=0;j<arr[i].length;j++){
                sum+=arr[i][j];
            }
        }

        for(int[] arr1 : arr){
            for(int arr2 : arr1){
                sum=sum+arr2;
            }
        }
        return sum;
  • 外层循环for(int[] arr1 : arr)

    • arr 是一个二维数组(int[][] 类型)。
    • 每次迭代时,arr1 会指向 arr 中的一个一维数组元素。
  • 内层循环for(int arr2 : arr1)

    • 遍历当前一维数组 arr1,每次迭代时,arr2 会指向 arr1 中的一个 int 类型元素。
  • 整体作用:把二维数组 arr 中的所有元素累加,最终返回总和 sum

    for (元素类型 变量名 : 数组/实现Iterable接口的集合) {
    // 循环体,每次迭代时,变量会自动指向当前元素
    }

增强 for 循环(Enhanced for Loop) ,也叫 foreach 循环,是 JDK 5 引入的语法,专门用来简化数组或集合的遍历操作。

JAVA19 修改Data类的定义

JAVA19 修改Data类的定义

复制代码
class Data {

    private int x;
    private int y;

    public Data(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

}

private 仅能在当前类内部访问,外部类(包括子类、同包类)都无法直接调用

public 可以被任何类访问,无论是否在同一个包、是否是子类

  • public是 "大家都能用",private是 "只有自己能用",第二段代码用 public 才是能正常用的,第一段用 private 等于锁死了用不了;
  • this.就是 "分清重名的东西",没加 this. 的话,代码会 "认不出" 该给谁赋值,加了才会把值给对;
  • 第一段代码又用 private 又没加 this.,又锁门又给错东西,等于白写;第二段又用 public 又加 this.,才是又能用又没错的写法

this. 的差别(就比分清 "两个重名的人")

咱们生活里常遇到 "重名" 的情况 ------ 比如孙子叫 "小明",邻居家小孩也叫 "小明",奶奶喊 "小明过来",俩人都可能过来,分不清。这时候奶奶说 "这个 小明(咱们家的)过来",就只叫到你了 ------this.就是代码里的 "这个",专门分清 "重名的东西"

this.就一个核心用:当两个东西名字一样时,加个 this.,就知道指的是 "自己家的那个",不会弄混

JAVA20 验证年龄

复制代码
    public void setAge(int age){
        if(age<0){
            this.age=0;
        }
        else if(age>200){
            this.age=200;
        }else{
            this.age=age;
        }
    }
    public int getAge(){
        return age;
    }

封装的核心价值

  • 数据安全:避免外部直接操作属性导致的非法数据(比如这里的年龄异常值)。
  • 低耦合 / 易维护:内部逻辑修改不影响外部代码,降低了代码的依赖风险。
  • 隐藏复杂度:外部只需关注「怎么用」,不需要关注「内部怎么实现」,简化了交互成本。
  1. 隐藏内部属性 Person 类的age属性通常会用private修饰,这意味着外部代码无法直接修改age(比如不能写person.age = -5;),只能通过类提供的方法间接操作。

  2. 通过方法控制访问逻辑 代码中的setAge()方法就是封装的核心体现:

    1. 当外部调用setAge()设置年龄时,方法内部会先校验输入的合法性(小于 0 则设为 0,大于 200 则设为 200,否则正常赋值)。
    2. 这就避免了外部随意设置非法年龄(如负年龄、超过 200 的年龄),从根源上保证了age属性的安全性。
  3. 对外提供安全接口 getAge()setAge()是类对外暴露的「访问接口」:

    1. 外部不需要知道age的校验逻辑,只需要调用setAge()传值、调用getAge()取值即可。
    2. 后续如果要修改年龄的校验规则(比如把上限从 200 改成 150),只需要修改setAge()的内部代码,外部调用者完全不需要改动,极大提升了代码的可维护性。
相关推荐
代码游侠2 小时前
C语言核心概念复习(二)
c语言·开发语言·数据结构·笔记·学习·算法
XX風2 小时前
2.1_binary_search_tree
算法·计算机视觉
不想写bug呀2 小时前
买卖股票问题
算法·买卖股票问题
-Try hard-2 小时前
完全二叉树、非完全二叉树、哈希表的创建与遍历
开发语言·算法·vim·散列表
茉莉玫瑰花茶3 小时前
C++ 17 详细特性解析(4)
开发语言·c++·算法
long3163 小时前
K‘ 未排序数组中的最小/最大元素 |期望线性时间
java·算法·排序算法·springboot·sorting algorithm
进击的小头3 小时前
FIR滤波器实战:音频信号降噪
c语言·python·算法·音视频
xqqxqxxq3 小时前
洛谷算法1-1 模拟与高精度(NOIP经典真题解析)java(持续更新)
java·开发语言·算法
razelan3 小时前
初级算法技巧 4
算法