牛客网刷题——java

简介: 牛客网刷题——java

一、数列求和

有数列为:9,99,999,...,9999999999。要求使用程序计算此数列的和,并在控制台输出结果。(请尝试使用循环的方式生成这个数列并同时在循环中求和)
方法1:

 public static void main(String[] args) {
        //数列求和
        long sum = 0L;
        for (long i = 9; i <= 9999999999L; i=i*10+9) {
            sum+=i;
        }
        System.out.println(sum);
    }

方法2:

 public static void main(String[] args) {
        long[] arr = {9,99,999,9999,99999,999999,9999999,99999999,999999999,9999999999L};
        long sum = 0L;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }
        System.out.println(sum);
    }

二、二维数组求和

给定一个二维数组,请你编写一个求和函数,计算出这个数组元素的和

 public static void main(String[] args) {
        int[][]  arr = {{11,33,55},{22,44,66,88},{131,214,315,146},{928,827,726,625},{424,525}};
        int sum=add(arr);
        System.out.println(sum);
    }

    public static int add(int[][] arr) {
        int sum=0;
        for(int i = 0;i < arr.length;i++) {
            for(int j = 0;j < arr[0].length;j++) {
                sum += arr[i][j];
            }
        }
        return sum;
    }

在这里插入图片描述
我们可以发现这里出现了数组越界错误.
在这里插入图片描述
我们可以发现这里纵标限定的为arr[0]的长度,但这个二维数组的每个纵行的长度是不一样的,所以这样会出现数组越界错误。

 public static void main(String[] args) {
        int[][]  arr = {{11,33,55},{22,44,66,88},{131,214,315,146},{928,827,726,625},{424,525}};
        int sum=add(arr);
        System.out.println(sum);
    }

    public static int add(int[][] arr) {
        int sum=0;
        for(int i = 0;i < arr.length;i++) {
            for(int j = 0;j < arr[i].length;j++) {
                sum += arr[i][j];
            }
        }
        return sum;
    }

在这里插入图片描述
我们再打印二维数组的时候,纵行的范围必须是每行的范围才可以.

for (int[] arr1:arr) {
            for (int x:arr1) {
                sum += x;
            }
        }

或者利用foreach也可以.

三、判断各类型字符个数

输入一行字符串,分别统计出其中英文字母、空格、数字和其它字符的个数
在这里插入图片描述

public static void main(String[] args) {
        int numbers = 0;
        int words = 0;
        int space = 0;
        int other = 0;
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        for (int i = 0; i < str.length(); i++) {
            if(Character.isLetter(str.charAt(i))) {
                words++;
            }else if(Character.isDigit(str.charAt(i))) {
                numbers++;
            }else if(Character.isWhitespace(str.charAt(i))) {
                space++;
            }else {
                other++;
            }
        }
        System.out.println("英文字母"+words+"数字"+numbers+"空格"+space+"其他"+other);
    }

在这里插入图片描述

四、定义打印方法

已知有三个类:First、Second、Third。要求定义一个打印方法,支持传入任意引用类型的参数(包括上述三个类),并在方法内部打印出对象的字符串形式。

public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String className = scanner.next();
            // print就是需要你定义的方法
            print(Class.forName(className).newInstance());
        }
    }
    public static void print(Object obj) {
        System.out.println(obj.toString());
    }
}

class First {
    public String toString() {
        return "First";
    }
}

class Second {
    public String toString() {
        return "Second";
    }
}

class Third {
    public String toString() {
        return "Third";
    }
多态性,是子类的对象赋给了父类的引用,使用的前提是有继承关系、有方法的重写
本题中的三个类都重写了toString()方法
那么很显然,需要找到一个类,是本题中三个类的共同父类,又有toString()方法
并且有forName()方法和newInstance()方法,以便在第10行的print()中能传入一个对象
不用想了,平时就是用 Object类,它是所有类的父类,又拥有各种各样的方法

# 五、类型判断
父类Base有两个子类:Sub1、Sub2,现有一个方法getClassName(),要求传入Base类型的实例,在方法内部判定其具体的类型,返回的是类型的简单名字(不含包名),请补全getClassName()方法的判断逻辑。
输入描述:
在这里插入图片描述
在这里插入图片描述

 public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String className = scanner.next();
            Base obj = (Base) Class.forName(className).newInstance();
            System.out.println(getClassName(obj));
        }
    }

    public static String getClassName(Base obj) {

        if(obj instanceof Sub1) {
            return "Sub1";
        }else if(obj instanceof Sub2) {
            return "Sub2";
        }else {
            return "Base";
        }
    }

class Base {

}

class Sub1 extends Base {

}

class Sub2 extends Base {

}
目录
相关文章
|
7月前
|
Java
2022蓝桥杯大赛软件类省赛Java大学B组真题 刷题统计
2022蓝桥杯大赛软件类省赛Java大学B组真题 刷题统计
68 0
|
8月前
|
算法 Java C++
【Java 刷题记录】位运算
【Java 刷题记录】位运算
58 2
|
8月前
|
Java
JAVA数据结构刷题 -- 二叉树进阶
JAVA数据结构刷题 -- 二叉树进阶
50 0
|
8月前
|
存储 Java
JAVA数据结构刷题 -- 力扣二叉树
JAVA数据结构刷题 -- 力扣二叉树
61 0
|
8月前
|
算法 Java C++
刷题两个月,从入门到字节跳动offer丨GitHub标星16k+,美团Java面试题
刷题两个月,从入门到字节跳动offer丨GitHub标星16k+,美团Java面试题
|
8月前
|
消息中间件 前端开发 Java
java面试刷题软件kafka和mq的区别面试
java面试刷题软件kafka和mq的区别面试
|
8月前
|
Java 索引
JAVA刷题之数组的总结和思路分享
JAVA刷题之数组的总结和思路分享
|
11天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
13天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。
|
13天前
|
消息中间件 缓存 安全
Java多线程是什么
Java多线程简介:本文介绍了Java中常见的线程池类型,包括`newCachedThreadPool`(适用于短期异步任务)、`newFixedThreadPool`(适用于固定数量的长期任务)、`newScheduledThreadPool`(支持定时和周期性任务)以及`newSingleThreadExecutor`(保证任务顺序执行)。同时,文章还讲解了Java中的锁机制,如`synchronized`关键字、CAS操作及其实现方式,并详细描述了可重入锁`ReentrantLock`和读写锁`ReadWriteLock`的工作原理与应用场景。