LeetCode第281场周赛

x33g5p2x  于2022-02-20 转载在 其他  
字(3.5k)|赞(0)|评价(0)|浏览(309)

📒博客首页:崇尚学技术的科班人
🍣今天给大家带来的文章是《LeetCode第281场周赛》🍣
🍣希望各位小伙伴们能够耐心的读完这篇文章🍣
🙏博主也在学习阶段,如若发现问题,请告知,非常感谢🙏
💗同时也非常感谢各位小伙伴们的支持💗

🚀<1> 第一题🚀

✨题目✨

统计各位数字之和为偶数的整数个数
给你一个正整数 num ,请你统计并返回 小于或等于 num 且各位数字之和为 偶数 的正整数的数目。
正整数的 各位数字之和 是其所有位上的对应数字相加的结果。

✨示例✨

  • 示例1
输入:num = 4
输出:2
解释:
只有 2 和 4 满足小于等于 4 且各位数字之和为偶数。
  • 示例2
输入:num = 30
输出:14
解释:
只有 14 个整数满足小于等于 30 且各位数字之和为偶数,分别是: 
2、4、6、8、11、13、15、17、19、20、22、24、26 和 28 。

✨提示✨

  • 1 <= num <= 1000

⭐思路⭐

  • 思路

这道题是签到题,我的做法就是模拟这个过程,从 1 ~ num 进行枚举,然后对每一个数进行拆解查看是否符合要求。如果符合要求的话,我们就进行计数加一;如果不符合要求的话,那么不再任何事情。

✨代码实现✨

class Solution {
    public int sum(int n){
        int num = 0;
        while(n != 0){
            int x = n % 10;
            num += x;
            n /= 10;
        }
        return num;
    }
    public int countEven(int num) {
        int cnt = 0;
        for(int i = 1; i <= num; i ++){
            int nums = sum(i);
            if(nums % 2 == 0) cnt ++;
        }
        return cnt;
    }
}

✨运行结果✨

🚀<2> 第二题🚀

✨题目✨

合并零之间的节点
给你一个链表的头节点 head ,该链表包含由 0 分隔开的一连串整数。链表的 开端 和 末尾 的节点都满足 Node.val == 0
对于每两个相邻的 0 ,请你将它们之间的所有节点合并成一个节点,其值是所有已合并节点的值之和。然后将所有 0 移除,修改后的链表不应该含有任何 0
返回修改后链表的头节点 head

✨示例✨

  • 示例1

输入:head = [0,3,1,0,4,5,2,0]
输出:[4,11]
解释:
上图表示输入的链表。修改后的链表包含:
- 标记为绿色的节点之和:3 + 1 = 4
- 标记为红色的节点之和:4 + 5 + 2 = 11
  • 示例2

输入:head = [0,1,0,3,0,2,2,0]
输出:[1,3,4]
解释:
上图表示输入的链表。修改后的链表包含:
- 标记为绿色的节点之和:1 = 1
- 标记为红色的节点之和:3 = 3
- 标记为黄色的节点之和:2 + 2 = 4

✨提示✨

  • 列表中的节点数目在范围[3, 2 * 105]
  • 0 <= Node.val <= 1000
  • 不 存在连续两个 Node.val == 0的节点
  • 链表的 开端 和 末尾 节点都满足 Node.val == 0

⭐思路⭐

  • 思路

其实这道题也是一道简单的模拟题,我们对两个 0 的链表节点之间进行求和,如果遇到链表的结点是 0 的话,那么就进行另一个链表节点的创建,然后将存储总和变量置为 0

✨代码实现✨

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeNodes(ListNode head) {
        ListNode node = new ListNode(0);
        
        ListNode node1 = head.next;
        ListNode node2 = node;
        int sum = 0;
        while(node1 != null){
            sum += node1.val;
            if(node1.val == 0){
                ListNode node3 = new ListNode(sum);
                node2.next = node3;
                node2 = node2.next;
                sum = 0;
            }
            node1 = node1.next;
        }
        return node.next;
    }
}

✨运行结果✨

🚀<3> 第三题🚀

✨题目✨

构造限制重复的字符串
给你一个字符串 s 和一个整数 repeatLimit ,用 s 中的字符构造一个新字符串 repeatLimitedString ,使任何字母 连续 出现的次数都不超过 repeatLimit 次。你不必使用 s 中的全部字符。
返回 字典序最大的 repeatLimitedString
如果在字符串 ab 不同的第一个位置,字符串 a 中的字母在字母表中出现时间比字符串 b 对应的字母晚,则认为字符串 a 比字符串 b 字典序更大 。如果字符串中前 min(a.length, b.length) 个字符都相同,那么较长的字符串字典序更大。

✨示例✨

  • 示例1
输入:s = "cczazcc", repeatLimit = 3
输出:"zzcccac"
解释:使用 s 中的所有字符来构造 repeatLimitedString "zzcccac"。
字母 'a' 连续出现至多 1 次。
字母 'c' 连续出现至多 3 次。
字母 'z' 连续出现至多 2 次。
因此,没有字母连续出现超过 repeatLimit 次,字符串是一个有效的 repeatLimitedString 。
该字符串是字典序最大的 repeatLimitedString ,所以返回 "zzcccac" 。
注意,尽管 "zzcccca" 字典序更大,但字母 'c' 连续出现超过 3 次,所以它不是一个有效的 repeatLimitedString 。
  • 示例2
输入:s = "aababab", repeatLimit = 2
输出:"bbabaa"
解释:
使用 s 中的一些字符来构造 repeatLimitedString "bbabaa"。 
字母 'a' 连续出现至多 2 次。 
字母 'b' 连续出现至多 2 次。 
因此,没有字母连续出现超过 repeatLimit 次,字符串是一个有效的 repeatLimitedString 。 
该字符串是字典序最大的 repeatLimitedString ,所以返回 "bbabaa" 。 
注意,尽管 "bbabaaa" 字典序更大,但字母 'a' 连续出现超过 2 次,所以它不是一个有效的 repeatLimitedString 。

✨提示✨

  • 1 <= repeatLimit <= s.length <= 10^5
  • s由小写英文字母组成

⭐思路⭐

  • 思路

这道题我使用的解法是 贪心 + 双指针,我们先对数组进行从大到小的排序,然后进行双指针流程:首先我们进行对于同一个字符进行计数,然后对出现次数超过 repeatLimit 进行后面的字符进行间隔。

✨代码实现✨

class Solution {
    public String repeatLimitedString(String s, int repeatLimit) {
        char[] charArray = s.toCharArray();
        Arrays.sort(charArray);
        int n = charArray.length;
        StringBuilder sb = new StringBuilder();
        for(int i = n - 1; i >= 0; ){
            char a = charArray[i];
            int j = i;
            while(j >= 0 && a == charArray[j]) j --;
            
            int cnt = i - j;
            if(j < 0){
                for(int k = 0; k < cnt && k < repeatLimit; k ++){
                    sb.append(charArray[i]);
                }
                break;
            }
            //System.out.println(cnt + " " + i + " " + j);
            for(int k = 1; k <= cnt; k ++){
                sb.append(charArray[i]);
                if(k % repeatLimit == 0 && k == cnt) break;
                if(k % repeatLimit == 0 && j < 0) break;
                else if(k % repeatLimit == 0 && j >= 0) sb.append(charArray[j --]);
            }
            i = j;
        }
        return new String(sb);
    }
}

✨运行结果✨

相关文章