📒博客首页:崇尚学技术的科班人
🍣今天给大家带来的文章是《LeetCode第281场周赛》
🍣
🍣希望各位小伙伴们能够耐心的读完这篇文章🍣
🙏博主也在学习阶段,如若发现问题,请告知,非常感谢🙏
💗同时也非常感谢各位小伙伴们的支持💗
统计各位数字之和为偶数的整数个数
给你一个正整数 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;
}
}
合并零之间的节点
给你一个链表的头节点 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;
}
}
构造限制重复的字符串
给你一个字符串 s
和一个整数 repeatLimit
,用 s
中的字符构造一个新字符串 repeatLimitedString
,使任何字母 连续 出现的次数都不超过 repeatLimit
次。你不必使用 s
中的全部字符。
返回 字典序最大的 repeatLimitedString
。
如果在字符串 a
和 b
不同的第一个位置,字符串 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);
}
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_56727438/article/details/123032448
内容来源于网络,如有侵权,请联系作者删除!