小记
本篇博客记录小黑第五次参加leetcode周赛(296场次)的成绩,以及对题目的总结,以便鞭策自己不断前进 。
这次周赛是我第五次参加,这次比赛只完成了签到题。成绩很拉跨。
下面主要是对题目进行总结,也是为之后面试做准备。
题目一:6090. 极大极小游戏 - 力扣(LeetCode)
思路: 这道题简单。按照题目给的信息完成代码即可。
解决代码:
public class que1 {
public static void main(String[] args) {
int[] nums = new int[]{1,3,5,2,4,8,2,2};
int i = minMaxGame(nums);
System.out.println(i);
}
public static int minMaxGame(int[] nums) {
int n = nums.length;
if (n==1) return nums[0];
if (n==0) return 0;
int[] result =minMax(nums);
while (result.length!=1){
result =minMax(result);
}
return result[0];
}
public static int[] minMax(int[] nums){
int[] newInt = new int[nums.length/2];
for (int i = 0; i <nums.length/2 ; i++) {
if (i%2==0){
newInt[i]=Math.min(nums[2*i],nums[2*i+1]);
}else {
newInt[i]=Math.max(nums[2*i],nums[2*i+1]);
}
}
return newInt;
}
}
题目二:6091. 划分数组使最大差为 K - 力扣(LeetCode)
思路: 这道题目思路,排序+贪心。解题步骤为:
1,将数组排序。
2,遍历数组,如果该数与划分的最后一个数组中的最小值差值大于k,则划分一个新的数组并将最小值设置为划分新的数组中的第一个值。
解决代码:
public class que2 {
public static void main(String[] args) {
int[] ints = {16,8,17,0,3,17,8,20};
int l = 10;
int i = partitionArray(ints, l);
System.out.println(i);
}
public static int partitionArray(int[] nums, int k) {
Arrays.sort(nums);
int r = 1;
int min = nums[0];
for (int i = 1; i <nums.length ; i++) {
if (nums[i]-min<=k){
continue;
}
r++;
min = nums[i];
System.out.println(min);
}
return r;
}
}
题目三: 6092. 替换数组中的元素 - 力扣(LeetCode)
思路: 本题采用Map集合key来存储nums数值以及修改后的数值,value来存储nums的下标
步骤:
1,将nums中的数值以及其下标存放到Map集合中
2,遍历operations,将map中key=operation[0]的元素删除并获得其下标,并将该下标对应的key重新赋值为operation[1]
3,按顺序将map中的key放入nums数组中
解决代码:
public class que3 {
public static void main(String[] args) {
int[] nums = new int[]{1,2,4,6};
int[][] arr =new int[][]{{1,3},{4,7},{6,1}};
arrayChange(nums,arr);
}
public static int[] arrayChange(int[] nums, int[][] operations) {
int n = nums.length;
HashMap<Integer,Integer> pos =new HashMap<>();
for (int i = 0; i <n ; i++) {
pos.put(nums[i],i);
}
for (int[] op:
operations) {
int tmp = pos.remove(op[0]);
System.out.println(tmp);
pos.put(op[1],tmp);
}
for(int i :pos.keySet()){
nums[pos.get(i)]=i;
}
return nums;
}
}
题目四:6093. 设计一个文本编辑器 - 力扣(LeetCode)
思路: 本题模拟光标移动。
思路:利用StringBuilder创建左右俩个缓存区来模拟光标。需要注意的是,左缓冲区是顺序存放元素,右缓存区是逆序存放元素。实现见下
本题思路参考Leetcode大神arignote ,详情可见大神Leetcode主页。
解决代码:
class TextEditor {
private StringBuilder left = new StringBuilder(), right = new StringBuilder();
public void addText(String text) {
left.append(text);
}
public int deleteText(int k) {
int result = Math.min(k, left.length());
left.setLength(left.length() - result);
return result;
}
public String cursorLeft(int k) {
for (int i = 0; i < k && left.length() > 0; i++) {
right.append(left.charAt(left.length() - 1));
left.deleteCharAt(left.length() - 1);
}
return left.substring(Math.max(0, left.length() - 10));
}
public String cursorRight(int k) {
for (int i = 0; i < k && right.length() > 0; i++) {
left.append(right.charAt(right.length() - 1));
System.out.println(right.length()-1);
System.out.println(right.charAt(right.length()-1));
right.deleteCharAt(right.length() - 1);
}
System.out.println(left.toString());
return left.substring(Math.max(0, left.length() - 10));
}
}
总结:以上就是LeetCode第296场周赛题目,这次只做出了一道题;这次三道题目的解题思路很很简单,但是考查的是解法的时间空间复杂度。这次发挥非常不好,继续努力。保二争三(四)。