LeetCode 1446. 连续字符 / 506. 相对名次 / 1005. K 次取反后最大化的数组和

1446. 连续字符

2021.12.1 每日一题,又是新的一月

题目描述

给你一个字符串 s ,字符串的「能量」定义为:只包含一种字符的最长非空子字符串的长度。

请你返回字符串的能量。

示例 1:

输入:s = “leetcode”
输出:2
解释:子字符串 “ee” 长度为 2 ,只包含字符 ‘e’ 。

示例 2:

输入:s = “abbcccddddeeeeedcba”
输出:5
解释:子字符串 “eeeee” 长度为 5 ,只包含字符 ‘e’ 。

示例 3:

输入:s = “triplepillooooow”
输出:5

示例 4:

输入:s = “hooraaaaaaaaaaay”
输出:11

示例 5:

输入:s = “tourist”
输出:1

提示:

1 <= s.length <= 500
s 只包含小写英文字母。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/consecutive-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

class Solution {
    public int maxPower(String s) {
        int l = s.length();
        int count = 1;
        int max = 1;
        for(int i = 1; i < l; i++){
            if(s.charAt(i) == s.charAt(i - 1)){
                count++;
                max = Math.max(count, max);
            }else{
                count = 1;
            }
        }
        return max;
    }
}

506. 相对名次

2021.12.2 每日一题

题目描述

给你一个长度为 n 的整数数组 score ,其中 score[i] 是第 i 位运动员在比赛中的得分。所有得分都 互不相同 。

运动员将根据得分 决定名次 ,其中名次第 1 的运动员得分最高,名次第 2 的运动员得分第 2 高,依此类推。运动员的名次决定了他们的获奖情况:

名次第 1 的运动员获金牌 “Gold Medal” 。
名次第 2 的运动员获银牌 “Silver Medal” 。
名次第 3 的运动员获铜牌 “Bronze Medal” 。
从名次第 4 到第 n 的运动员,只能获得他们的名次编号(即,名次第 x 的运动员获得编号 “x”)。
使用长度为 n 的数组 answer 返回获奖,其中 answer[i] 是第 i 位运动员的获奖情况。

示例 1:

输入:score = [5,4,3,2,1]
输出:[“Gold Medal”,“Silver Medal”,“Bronze Medal”,“4”,“5”]
解释:名次为 [1st, 2nd, 3rd, 4th, 5th] 。

示例 2:

输入:score = [10,3,8,9,4]
输出:[“Gold Medal”,“5”,“Bronze Medal”,“Silver Medal”,“4”]
解释:名次为 [1st, 5th, 3rd, 2nd, 4th] 。

提示:

n == score.length
1 <= n <= 10^4
0 <= score[i] <= 10^6
score 中的所有值 互不相同

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/relative-ranks
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

class Solution {
    public String[] findRelativeRanks(int[] score) {
        //我能想到的就是用哈希表记录位置,然后排序,放在对应位置上
        int l = score.length;
        Map<Integer, Integer> map = new HashMap<>();
        for(int i = 0; i < l; i++){
            map.put(score[i], i);
        }
        Arrays.sort(score);
        String[] three = {"Gold Medal", "Silver Medal", "Bronze Medal"};
        String[] res = new String[l];
        for(int i = l - 1; i >= 0; i--){
            if(i >= l - 3){
                res[map.get(score[i])] = three[l - i - 1];
            }else{
                res[map.get(score[i])] = l - i + "";
            }
        }
        return res;
    }
}

1005. K 次取反后最大化的数组和

2021.12.3 每日一题,12月开头三个简单题

题目描述

给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:

选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。
重复这个过程恰好 k 次。可以多次选择同一个下标 i 。

以这种方式修改数组后,返回数组 可能的最大和 。

示例 1:

输入:nums = [4,2,3], k = 1
输出:5
解释:选择下标 1 ,nums 变为 [4,-2,3] 。

示例 2:

输入:nums = [3,-1,0,2], k = 3
输出:6
解释:选择下标 (1, 2, 2) ,nums 变为 [3,1,0,2] 。

示例 3:

输入:nums = [2,-3,-1,5,-4], k = 2
输出:13
解释:选择下标 (1, 4) ,nums 变为 [2,3,-1,5,4] 。

提示:

1 <= nums.length <= 10^4
-100 <= nums[i] <= 100
1 <= k <= 10^4

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximize-sum-of-array-after-k-negations
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

用了排序,复杂度高了点,不过超了100%
不用排序的话,就是用数组记录每个数出现的次数,然后再反转就行了,也不难

class Solution {
    public int largestSumAfterKNegations(int[] nums, int k) {
        //先排序,然后将开头的负数取反,然后再排序,如果还有负数,那么就直接返回总和
        //如果没有负数了,那么就对第一个数一直取反

        int l = nums.length;
        Arrays.sort(nums);
        //将负数取反
        int idx = 0;
        while(idx < k && idx < l){
            if(nums[idx] >= 0)
                break;
            nums[idx] = -nums[idx];
            idx++;
        }
        Arrays.sort(nums);
        if(idx < k){
            int t = k - idx;
            nums[0] = t % 2 == 0 ? nums[0] : -nums[0];
        }
        int sum = 0;
        for(int s : nums){
            sum += s;
        }
        return sum;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值