Skip to content

Commit 76704a3

Browse files
committed
新增一个算法题:轮转数组
1 parent 61c0784 commit 76704a3

File tree

1 file changed

+47
-1
lines changed

1 file changed

+47
-1
lines changed

Algorithm/src/leetcode/PracticeTest.java

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,58 @@
1111
*/
1212
public class PracticeTest {
1313

14+
/** 2024-12-23
15+
* 轮转数组
16+
* 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
17+
* 示例 1:
18+
* 输入: nums = [1,2,3,4,5,6,7], k = 3
19+
* 输出: [5,6,7,1,2,3,4]
20+
* 解释:
21+
* 向右轮转 1 步: [7,1,2,3,4,5,6]
22+
* 向右轮转 2 步: [6,7,1,2,3,4,5]
23+
* 向右轮转 3 步: [5,6,7,1,2,3,4]
24+
* 示例 2:
25+
* 输入:nums = [-1,-100,3,99], k = 2
26+
* 输出:[3,99,-1,-100]
27+
* 解释:
28+
* 向右轮转 1 步: [99,-1,-100,3]
29+
* 向右轮转 2 步: [3,99,-1,-100]
30+
* 个人思路:(未通过,有一个测试用例超时)循环k次,每次循环取出数组最后一位,其他数据往后移动一位,再把最后一位放到数组最前面
31+
* 官方思路:使用一个新数组存储 循环k次 放到新数组的 (i + k) % n 位置
32+
*/
33+
34+
@Test
35+
public void practice6() {
36+
// 输入: nums = [1,2,3,4,5,6,7], k = 3
37+
int[] nums = {1,2,3,4,5,6,7};
38+
int k = 54944;
39+
// 具体逻辑
40+
for (int i = 0; i < k; i++) {
41+
int lastData = nums[nums.length - 1];
42+
for (int j = nums.length - 1; j > 0; j--) {
43+
nums[j] = nums[j - 1];
44+
}
45+
nums[0] = lastData;
46+
}
47+
// 官方解法
48+
int n = nums.length;
49+
int[] newArr = new int[n];
50+
for (int i = 0; i < n; ++i) {
51+
newArr[(i + k) % n] = nums[i];
52+
}
53+
System.arraycopy(newArr, 0, nums, 0, n);
54+
55+
System.out.println(Arrays.toString(nums));
56+
57+
}
58+
59+
1460
/** 2024-12-11
1561
* 多数元素
1662
* 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
1763
* 你可以假设数组是非空的,并且给定的数组总是存在多数元素。
1864
*
19-
* 思路:双层遍历,数组中的每个元素从角标0开始计数,超过阈值直接记录。
65+
* 思路:(效果不如官方)双层遍历,数组中的每个元素从角标0开始计数,超过阈值直接记录。
2066
* 官解地址:https://leetcode.cn/problems/majority-element/solutions/?envType=study-plan-v2&envId=top-interview-150
2167
*/
2268
@Test

0 commit comments

Comments
 (0)