多线程问题(算法高阶、多线程算法)

  1. 程序中需要开启两个线程(线程1和线程2)
  2. 线程1固定5秒钟执行一次
  3. 线程2固定10秒钟执行一次
  4. 开启程序如何做到线程1执行完成后再执行线程2并且在之后无论谁先执行都需等待对方执行完成后才可以开始执行

解答:

public class TestThreadJoin {
    public static void main(String[] args) {
        final Object lock = new Object();
        Runnable r1 = () -> {
            while (true) {
                synchronized (lock) {
                    System.out.println("线程1执行。");
                }
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        Runnable r2 = () -> {
            while (true) {
                synchronized (lock) {
                    System.out.println("线程2执行。");
                }
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        new Thread(r1).start();
        new Thread(r2).start();
    }
}

存在重复元素 II(数组、哈希表)

给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引_ i_ 和_ j_,使得 nums [i] = nums [j],并且 ij 的差的 绝对值 至多为 _k_。

示例 1: 输入: nums = [1,2,3,1], k = 3 输出: true 示例 2: 输入: nums = [1,0,1,1], k = 1 输出: true 示例 3: 输入: nums = [1,2,3,1,2,3], k = 2 输出: false

解答:

public class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int k) {
        int left = 0;
        int right = -1;
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        while (left < nums.length) {
            if (right + 1 < nums.length && right - left < k) {
                right++;
                if (hashMap.containsKey(nums[right])) {
                    return true;
                } else {
                    hashMap.put(nums[right], 1);
                }
            } else {
                hashMap.put(nums[left], hashMap.get(nums[left]) - 1);
                if (hashMap.get(nums[left]) == 0) {
                    hashMap.remove(nums[left]);
                }
                left++;
            }
        }
        return false;
    }
}

计数质数(数组、数学)

统计所有小于非负整数 _n _的质数的数量。

示例 1: 输入:n = 10 输出:4 解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。 示例 2: 输入:n = 0 输出:0 示例 3: 输入:n = 1 输出:0

提示:

  • 0 <= n <= 5 * 106

解答:

class Solution {
    public int countPrimes(int n) {
        int flag = 0;
        if (n > 2)
            flag = 1;
        for (int i = 0; i < n; i++) {
            for (int j = 2; j < i; j++) {
                if (i % j == 0) {
                    break;
                }
                if (j == i - 1) {
                    flag++;
                }
            }
        }
        return flag;
    }
}

本文内容到此结束了, 如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。 如有错误❌疑问💬欢迎各位大佬指出。 主页共饮一杯无的博客汇总👨‍💻

保持热爱,奔赴下一场山海。🏃🏃🏃