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()的内部代码,外部调用者完全不需要改动,极大提升了代码的可维护性。
相关推荐
ShineWinsu1 天前
对于C++:继承的解析—上
开发语言·数据结构·c++·算法·面试·笔试·继承
pp起床1 天前
动态规划 | part05
算法·动态规划
GuangHeAI_ATing1 天前
国密算法SSD怎么选?这3款国产固态硬盘安全又高速
算法
雨泪丶1 天前
代码随想录算法训练营-Day34
算法
Yzzz-F1 天前
牛客寒假算法训练营2
算法
甄心爱学习1 天前
【python】获取所有长度为 k 的二进制字符串
python·算法
iAkuya1 天前
(leetcode)力扣100 76数据流的中位数(堆)
算法·leetcode·职场和发展
键盘鼓手苏苏1 天前
Flutter for OpenHarmony: Flutter 三方库 ntp 精准同步鸿蒙设备系统时间(分布式协同授时利器)
android·分布式·算法·flutter·华为·中间件·harmonyos
董董灿是个攻城狮1 天前
AI 视觉连载5:传统 CV 之均值滤波
算法
多恩Stone1 天前
【3D-AICG 系列-11】Trellis 2 的 Shape VAE 训练流程梳理
人工智能·pytorch·算法·3d·aigc