【Java】基础简单好题好思路总结

简介: 【Java】基础简单好题好思路总结

1. 判定素数

题目要求:

  • 给定一个数字,判定一个数字是否是素数
  • 解题思路:
  • 素数除了1和其本身再不能被其他数整除,假设一个数C不是素数,那么其一定可以写成 A * B = C 的形式,在所有的可能中一定有A或B是小于等于C的开平方的。
  • 还容易忽略的一点是 1不是素数

73d8c9be8b2a4960a39693770de0ac9a.png代码实现:

public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        //容易忽略
        if(n == 1){
            System.out.println(n + "不是素数");
            return;
        }
        int i;
        for (i = 2;i <= Math.sqrt(n);i++) {
            if(n%i == 0) {
                System.out.println(n + "不是素数");
                break;
            }
        }
        if(i > Math.sqrt(n)) {
            System.out.println(n + "是素数");
        }
    }

2. 奇数位于偶数之前

题目要求:

调整数组顺序使得奇数位于偶数之前。调整之后,不关心大小顺序。

如数组:[1,2,3,4,5,6]

调整后可能是:[1, 5, 3, 4, 2, 6]

解题思路:


本题可以使用2个下标,left 从0下标开始,right 从数组的最后一个元素下标开始;left遇到停下来,right遇到奇数停下来,然后完成交换,重复此操作,直到left和right相等结束73d8c9be8b2a4960a39693770de0ac9a.png

代码实现:

public static void oddNumbersAhead(int[] arr){
    int left = 0;
    int right = arr.length - 1;
    while (left < right){
        while ((arr[left]%2!=1) && (left<right)){
            left++;
        }
        while ((arr[right]%2!=0) && (left<right)){
            right--;
        }
        //交换
        int tmp = arr[left];
        arr[left] = arr[right];
        arr[right] = tmp;
    }
}
public static void main(String[] args){
    int[] arr = {1, 2, 3, 4, 5, 6, 7, 8};
    oddNumbersAhead(arr);
    System.out.println(Arrays.toString(arr));
}

3. 多数元素

题目要求:

  • 给定一个大小为 n 的数组,找到其中的多数元素;多数元素是指在数组中出现次数 大于 n/2 的元素。
  • 你可以假设数组是非空的,并且给定的数组总是存在多数元素73d8c9be8b2a4960a39693770de0ac9a.png
  • 解题思路:

思路1:

  • 数组中出现次数超过一半的数字,一定是排好序之后,中间位置的数字。

代码实现:

public static int findNum(int[] arr){
        Arrays.sort(arr);
        return arr[arr.length/2];
}
public static void main(String[] args){
        int[] arr = {1,1,2,3,4,5,5,5,5,5,5,5,5,5};
        int ret = findNum(arr);
        System.out.println(ret);
}

思路2:

  • 抵消法,设置一个计数器count、一个比较值 ret (初始为数组首元素的值),数组中值和ret进行比较,多数元素的个数一定比其他所有元素的个数要多;其他元素会被多数元素的抵消掉,最终留下来的一定时多数元素!

73d8c9be8b2a4960a39693770de0ac9a.png

代码实现:

public static int findNum(int[] arr){
        int ret = arr[0];
        int count = 0;
        for (int i = 0; i < arr.length; i++) {
            if(arr[i] == ret){
                count++;
            }else{
                count--;
            }
            if(count == 0){
                ret = arr[i+1];
            }
        }
        return ret;
    }
    public static void main(String[] args){
        int[] arr = {1,1,2,3,4,5,5,5,5,5,5,5,5,5};
        int ret = findNum(arr);
        System.out.println(ret);
    }
}

4. 存在连续三个奇数的数组

题目要求:

  • 给你一个整数数组 arr,请你判断数组中是否存在连续三个元素都是奇数的情况:如果存在,请返回 true ;否则,返回 false 。

73d8c9be8b2a4960a39693770de0ac9a.png

解题思路:

  • 数字是连续出现的,所以我们只需要定义一个计数器,如果连续出现的次数超过3,则返回true。

代码实现:

public static boolean isCoiledThreeOdd(int[] arr){
    int count = 0;
    for (int i = 0; i < arr.length; i++) {
        if(arr[i] % 2 == 1){
            count++;
            if(count == 3){
                return true;
            }
        }else{
            count = 0;
        }
    }
    return false;
}
public static void main(String[] args){
    int arr[] = {2,4,6,8,3,5,7,1,2,3};
    boolean ret = isCoiledThreeOdd(arr);
    System.out.println(ret);
}

5. 字符串最后一个单词的长度

题目要求:

73d8c9be8b2a4960a39693770de0ac9a.png

解题思路:


思路1:


找到字符串中最后一个空格的下标位置记录下来,再用字符中最后一个字符的下标减去空格的下标得到得就是最后一个单词的长度(见代码中的方法一和方法二)。

思路2:


利用split()方法将字符串以空格分割放到一个字符串数组当中,求出数组中最后一个字符串的长度即可。

代码实现:

public class Main{
     public  static void  main(String [] args) throws Exception{
         //方法一
         /*int index = -1;
         Scanner scan = new Scanner(System.in);
         String str = scan.nextLine();
         for(int i = str.length()-1; i >= 0; i--){
             if(str.charAt(i) == ' '){
                index = i;
                break;
             }
         }
         System.out.println(str.length() - 1 - index);
         */
         //方法二
         /*Scanner scan = new Scanner(System.in);
         String str = scan.nextLine();
         int index = str.lastIndexOf(' ');
         System.out.println(str.length() - 1 - index);
         */
         //方法三
         Scanner scan = new Scanner(System.in);
         String str = scan.nextLine();
         String[] s = str.split(" ");
         System.out.println(s[s.length-1].length());
     }
}
目录
相关文章
黑马B站Java0基础(力扣好题)
黑马B站Java0基础(力扣好题)
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
172 1
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
197 1
|
3月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
154 0
|
3月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
247 16
|
4月前
|
缓存 并行计算 安全
关于Java多线程详解
本文深入讲解Java多线程编程,涵盖基础概念、线程创建与管理、同步机制、并发工具类、线程池、线程安全集合、实战案例及常见问题解决方案,助你掌握高性能并发编程技巧,应对多线程开发中的挑战。
|
4月前
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践
|
5月前
|
Java API 调度
从阻塞到畅通:Java虚拟线程开启并发新纪元
从阻塞到畅通:Java虚拟线程开启并发新纪元
363 83
|
5月前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
210 0