力扣—315周赛

90 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

与对应负数同时存在的最大正整数

2441. 与对应负数同时存在的最大正整数 - 力扣(LeetCode)

屏幕截图 2022-10-21 154300.jpg

我们根据提示,我们可以发现,数组的长度不是很长,那我们就可以直接利用爆破的方法来解决。

我们直接让数组排序一下,排序好之后,我们从后面开始,看看数组里面有没有这个数的负数,如果有就直接返回,如果没有的话就找下一个,就这样一直找下去,如果最后没有找到的话就返回-1.

代码

public int findMaxK(int[] nums) {
    Arrays.sort(nums);
    for(int i = nums.length - 1;i >= 0;i--){
        if(find(nums , -nums[i])){
            return nums[i];
        }
    }
    return -1;
}
public boolean find(int[] nums , int num){
    for(int i = 0;i<nums.length;i++){
        if(nums[i] == num){
            return true;
        }
    }
    return false;
}

两个方法各司其职,上面的方法用来确定最大的值是什么,下面的方法来看看这个最大的值有没有负数在这个数组里面

反转之后不同整数的数目

2442. 反转之后不同整数的数目 - 力扣(LeetCode)

我们可以知道这个是要去重的,那我们的数据结构里面set就是用来去重的,我们可以利用这个来解决。我们可以直接创建一个Hashset,然后再创建一个函数是可以返回一个数逆置之后的样子的。

代码

public int countDistinctIntegers(int[] nums) {
    HashSet<Integer> hashSet = new HashSet<>();
    for(int i = 0;i<nums.length;i++){
        int cur = reverse(nums[i]);
        hashSet.add(cur);
        hashSet.add(nums[i]);
    }
    return hashSet.size();
}
public int reverse(int num){
    int ans = 0;
    while(num != 0){
        ans = ans * 10 + num % 10;
        num /= 10;
    }
    return ans;
}

上面有两个方法,前者是遍历数组,把每个数和逆置之后的放到hashset里面,第二个函数就是用来逆置数字的。

反转之后的数字和

2443. 反转之后的数字和 - 力扣(LeetCode)

这个其实和上面的那个题目差不多,就是创建一个反转方法,然后一个一个试就可以了。

代码

public boolean sumOfNumberAndReverse(int num) {
    for(int i = 0;i<= num;i++){
        if(i + reverse(i) == num){
            return true;
        }
    }
    return false;
}
public int reverse(int num){
    int ans = 0;
    while(num != 0){
        ans = ans * 10 + num % 10;
        num /= 10;
    }
    return ans;
}

统计定界子数组的数目

2444. 统计定界子数组的数目 - 力扣(LeetCode)

我们先创建一个循环,然后以轮到的数字为最后一个数字,然后判断前面有多少个符合的。如果有符合的就相加。如果遇到比maxK大的比minK小的,那就说明之前的都不会符合了,那我们就要从不符合的数字的下一位开始解决。

代码

public static long countSubarrays(int[] nums, int minK, int maxK) {
    long ans = 0;
    int max = -1;
    int min = -1;
    int begin = -1;
    for(int i = 0;i<nums.length;i++){
        if(nums[i] == maxK){
            max = i;
        }
        if(nums[i] == minK){
            min = i;
        }
        if(nums[i] < minK || nums[i] > maxK){
            begin = i;
        }
        ans += Math.max(Math.min(min , max) - begin , 0);
    }
    return ans;
}

我们的begin就代表着这个数组是从哪个位置开始的。我们的i表示的是结束的位置。

我们用max和min来表示位置。