【一周力扣总结】简单逻辑、数据结构、单调栈、数值逻辑、哈希、逻辑设计,并查集、数学

周一
有一个密钥字符串 S ,只包含字母,数字以及 ‘-’(破折号)。其中, N 个 ‘-’ 将字符串分成了 N+1 组。
给你一个数字 K,请你重新格式化字符串,使每个分组恰好包含 K 个字符。特别地,第一个分组包含的字符个数必须小于等于 K,但至少要包含 1 个字符。两个分组之间需要用 ‘-’(破折号)隔开,并且将所有的小写字母转换为大写字母。
给定非空字符串 S 和数字 K,按照上面描述的规则进行格式化。

示例 1:
输入:S = “5F3Z-2e-9-w”, K = 4
输出:“5F3Z-2E9W”
解释:字符串 S 被分成了两个部分,每部分 4 个字符;
注意,两个额外的破折号需要删掉。

题目链接
https://leetcode-cn.com/problems/license-key-formatting/
解题思路
本题的目标是将原始字符串中小写字母替换并转化为目标格式化的字符串。需要先获取原始字符串的有效长度然后循环添加‘-’转换为目标格式的字符串,需要注意结束时的‘-’。

周二
请你设计一个迭代器,除了支持 hasNext 和 next 操作外,还支持 peek 操作。
实现 PeekingIterator 类:
PeekingIterator(int[] nums) 使用指定整数数组 nums 初始化迭代器。
int next() 返回数组中的下一个元素,并将指针移动到下个元素处。
bool hasNext() 如果数组中存在下一个元素,返回 true ;否则,返回 false 。
int peek() 返回数组中的下一个元素,但 不 移动指针。

示例:
输入:
[“PeekingIterator”, “next”, “peek”, “next”, “next”, “hasNext”]
[[[1, 2, 3]], [], [], [], [], []]
输出:
[null, 1, 2, 2, 3, false]
解释:
PeekingIterator peekingIterator = new PeekingIterator([1, 2, 3]); // [1,2,3]
peekingIterator.next(); // 返回 1 ,指针移动到下一个元素 [1,2,3]
peekingIterator.peek(); // 返回 2 ,指针未发生移动 [1,2,3]
peekingIterator.next(); // 返回 2 ,指针移动到下一个元素 [1,2,3]
peekingIterator.next(); // 返回 3 ,指针移动到下一个元素 [1,2,3]
peekingIterator.hasNext(); // 返回 False

题目链接:https://leetcode-cn.com/problems/peeking-iterator

解题思路
本题的目标是设计一个目标类包含三个函数:next()指针指向下一个元素并移动、hasNext()是否有下一个元素、peek()下一个元素指针不移动。可用一个数组作为容器,在类中维护一个指针变量供三个函数使用。

周三
给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。

示例 1:
输入:[3, 2, 1]
输出:1
解释:第三大的数是 1 。

示例 2:
输入:[1, 2]
输出:2
解释:第三大的数不存在, 所以返回最大的数 2 。

示例 3:
输入:[2, 2, 3, 1]
输出:1
解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。
此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1 。

题目链接:https://leetcode-cn.com/problems/third-maximum-number
解题思路
本题目要获得一个序列中第三大的数据,可以对序列进行排序,然后顺序获得第三大的数,但是排序耗费的时间较多,是否能呦遍历一遍就能获得结果的方法?可以使用单调栈,在遍历过程中维护一个长度为3的单调栈,这样遍历一遍就能获得结果。注意没有第三大的书就要返回最大值。

周四
统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。
请注意,你可以假定字符串里不包括任何不可打印的字符。

示例:
输入: “Hello, my name is John”
输出: 5
解释: 这里的单词是指连续的不是空格的字符,所以 “Hello,” 算作 1 个单词。

题目链接:https://leetcode-cn.com/problems/number-of-segments-in-a-string

解题思路
本题要统计单词的个数,题目中对单词间隔的定义为不能打印的字符(包含空格),这就字符在ASCII中分布为:<=32和==127,共计34个,其余的字符均能打印。被不能打印的字符包围的就是一个单词,按此方法统计单词数量即可,注意原始输入的开头和结尾各算一个不能打印的字符。

周五
所有 DNA 都由一系列缩写为 ‘A’,‘C’,‘G’ 和 ‘T’ 的核苷酸组成,例如:“ACGAATTCCG”。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。

编写一个函数来找出所有目标子串,目标子串的长度为 10,且在 DNA 字符串 s 中出现次数超过一次。

示例 1:
输入:s = “AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT”
输出:[“AAAAACCCCC”,“CCCCCAAAAA”]
示例 2:
输入:s = “AAAAAAAAAAAAA”
输出:[“AAAAAAAAAA”]

题目链接:https://leetcode-cn.com/problems/repeated-dna-sequences

解题思路
本题要获取重复的长度为10的子串,可以使用哈希表来记录以及出现的子串,然后在遍历中判断是否重复出现。因为string的开销大,可以用数字代替字符串,如A=1,C=2,G=3,T=4,那么AAAAACCCCC=1111122222。

周六
题目描述

给你一个由非负整数 a1, a2, …, an 组成的数据流输入,请你将到目前为止看到的数字总结为不相交的区间列表。

实现 SummaryRanges 类:

SummaryRanges() 使用一个空数据流初始化对象。
void addNum(int val) 向数据流中加入整数 val 。
int[][] getIntervals() 以不相交区间 [starti, endi] 的列表形式返回对数据流中整数的总结。

示例:

输入:
[“SummaryRanges”, “addNum”, “getIntervals”, “addNum”, “getIntervals”, “addNum”, “getIntervals”, “addNum”, “getIntervals”, “addNum”, “getIntervals”]
[[], [1], [], [3], [], [7], [], [2], [], [6], []]
输出:
[null, null, [[1, 1]], null, [[1, 1], [3, 3]], null, [[1, 1], [3, 3], [7, 7]], null, [[1, 3], [7, 7]], null, [[1, 3], [6, 7]]]

解释:
SummaryRanges summaryRanges = new SummaryRanges();
summaryRanges.addNum(1); // arr = [1]
summaryRanges.getIntervals(); // 返回 [[1, 1]]
summaryRanges.addNum(3); // arr = [1, 3]
summaryRanges.getIntervals(); // 返回 [[1, 1], [3, 3]]
summaryRanges.addNum(7); // arr = [1, 3, 7]
summaryRanges.getIntervals(); // 返回 [[1, 1], [3, 3], [7, 7]]
summaryRanges.addNum(2); // arr = [1, 2, 3, 7]
summaryRanges.getIntervals(); // 返回 [[1, 3], [7, 7]]
summaryRanges.addNum(6); // arr = [1, 2, 3, 6, 7]
summaryRanges.getIntervals(); // 返回 [[1, 3], [6, 7]]

题目链接:https://leetcode-cn.com/problems/data-stream-as-disjoint-intervals

解题思路
本题同样是要设计一个目标类,可以实现添加数据和获取所有数据区间的两个功能。数据容器可以选择为定长的数组,关键是如何获取数据区间。一种方法是使用并查集的思想,标记每一个数的上一个数字结点(相邻的数)和下一个数字结点,这样遍历一次就能找到所有的数据区间。

周日
题目描述
你总共有 n 枚硬币,并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。

给你一个数字 n ,计算并返回可形成 完整阶梯行 的总行数。
在这里插入图片描述

题目链接:https://leetcode-cn.com/problems/arranging-coins

解题思路
题目中的阶梯是一个等差数列,使用数列的前n项和公式求救一个一元二次方程就能得到结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值