Leetcode之第296场周赛小记

小记

本篇博客记录小黑第五次参加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场周赛题目,这次只做出了一道题;这次三道题目的解题思路很很简单,但是考查的是解法的时间空间复杂度。这次发挥非常不好,继续努力。保二争三(四)。

  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王小二_Leon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值