多线程问题(算法高阶、多线程算法)
- 程序中需要开启两个线程(线程1和线程2)
- 线程1固定5秒钟执行一次
- 线程2固定10秒钟执行一次
- 开启程序如何做到线程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],并且 i 和 j 的差的 绝对值 至多为 _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;
}
}
本文内容到此结束了, 如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。 如有错误❌疑问💬欢迎各位大佬指出。 主页:共饮一杯无的博客汇总👨💻
保持热爱,奔赴下一场山海。🏃🏃🏃