(该板块博客仅为记录本人的leetcode练习)
leetcode周赛,只会前两道。。。。。第三道知道是动态规划但是没写出来😅(第三题智力问题)
5980.将字符串拆分为若干长度为k的组(简单)
解题思路:模拟。
代码:
package LeetCode.Code2022.January;
public class Solution5980 {
public String[] divideString(String s, int k, char fill) {
int len = s.length();
String[] ans = new String[(len + k - 1) / k ];
int j = 0, i;
for (i = 0; i < len; i = i + k) {
if (i + k <= len) {
ans[j++] = s.substring(i, i + k);
}
}
if (i != len) {
StringBuilder s1 = new StringBuilder(s.substring(i - k, len));
for (j = 0; j < i - len; j++) {
s1.append(fill);
}
ans[ans.length - 1] = s1.toString();
}
return ans;
}
}
5194.得到目标值的最少行动次数(中等)
解题思路:从目标值开始递减,当目标值为偶数且maxDouble值不为零这直接减半,反正将目标值减一,当maxdouble值为0时,直接进行target - 1即为到达1的所需步数
代码:
package LeetCode.Code2022.January;
public class Solution5194 {
public int minMoves(int target, int maxDoubles) {
int step = 0;
while (target != 1) {
if (maxDoubles == 0) {
step += target - 1;
break;
}
if (target % 2 == 0 && maxDoubles != 0) {
target = target / 2;
maxDoubles--;
} else {
target--;
}
step++;
}
return step;
}
}
382.链表随机节点(中等)
解题思路:拿到listNode之后将里面的元素初始化到List中,然后转化为一维数组,这个通过下标寻值更快,下标生成的方式是Math.random,保证生成的下标概率相当。
代码:
package LeetCode.Code2022.January;
import LeetCode.Utils.ListNode;
import java.util.ArrayList;
import java.util.List;
public class Solution382 {
List<Integer> list;
Integer[] arr;
public Solution382(ListNode head) {
ListNode node = head;
list = new ArrayList<>();
while (node != null) {
list.add(node.val);
node = node.next;
}
arr = list.toArray(new Integer[0]);
}
public int getRandom() {
int index = (int) (Math.random() * arr.length);
return arr[index];
}
}
1480.一维数组的动态和(简单)
解题思路:计算数组前缀和
package LeetCode.Code2022.January;
public class Solution1480 {
public int[] runningSum(int[] nums) {
int[] ans = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
if (i == 0) {
ans[i] = nums[i];
continue;
}
ans[i] = ans[i - 1] + nums[i];
}
return ans;
}
}
1486.数组异或操作(简单)
解题思路:直接异或,简单题思路个屁
package LeetCode.Code2022.January;
public class Solution1486 {
public int xorOperation(int n, int start) {
int ans = start;
for (int i = 1; i < n; i++) {
ans ^= (start + i * 2);
}
return ans;
}
}