LeetCode 284. 顶端迭代器 / 414. 第三大的数(TreeSet) / 434. 字符串中的单词数
Posted Zephyr丶J
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 284. 顶端迭代器 / 414. 第三大的数(TreeSet) / 434. 字符串中的单词数相关的知识,希望对你有一定的参考价值。
284. 顶端迭代器
2021.10.5 每日一题
题目描述
请你设计一个迭代器,除了支持 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
提示:
1 <= nums.length <= 1000
1 <= nums[i] <= 1000
对 next 和 peek 的调用均有效
next、hasNext 和 peek 最多调用 1000 次
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/peeking-iterator
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
根据java中的迭代器,实现顶端迭代器
关键点就是用一个变量存储下一个位置的元素,然后根据peek()或者是next()操作来返回响应结果
// Java Iterator interface reference:
// https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html
class PeekingIterator implements Iterator<Integer> {
private Iterator<Integer> iterator;
Integer nextElement;
public PeekingIterator(Iterator<Integer> iterator) {
// initialize any member here.
this.iterator = iterator;
nextElement = iterator.next();
}
// Returns the next element in the iteration without advancing the iterator.
public Integer peek() {
return nextElement;
}
// hasNext() and next() should behave the same as in the Iterator interface.
// Override them if needed.
@Override
public Integer next() {
Integer temp = nextElement;
nextElement = iterator.hasNext() ? iterator.next() : null;
return temp;
}
@Override
public boolean hasNext() {
if(nextElement == null)
return false;
else
return true;
}
}
414. 第三大的数
2021.10.6 每日一题
题目描述
给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
示例 1:
输入:[3, 2, 1]
输出:1
解释:第三大的数是 1 。
示例 2:
输入:[1, 2]
输出:2
解释:第三大的数不存在, 所以返回最大的数 2 。
示例 3:
输入:[2, 2, 3, 1]
输出:1
解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。
此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1 。
提示:
1 <= nums.length <= 10^4
-2^31 <= nums[i] <= 2^31 - 1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/third-maximum-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
写了老长,终于对了,主要是On的有点复杂
刚开始就是比较三个值(想到用long赋初值,但是想挑战一下自己),结果发现需要先赋三个数
所以就加了一个Set集合,然后用优先队列排序三个数
但是有一个例子[-2147483648,1,1] 没过,发现问题是在写排序时候的 lamada 表达式时,如果写成b-a,相减会越界,所以改成了这种实现接口的方式
然后发现[1,2,2,5,3,5] 错了,问题是需要去掉重复出现的
class Solution {
public int thirdMax(int[] nums) {
//最简单肯定是排序么,然后第三大的
//三个变量
int l = nums.length;
//得先找三个不同的数
int idx = 0;
Set<Integer> set = new HashSet<>();
set.add(nums[0]);
for(int i = 1; i < l; i++){
set.add(nums[i]);
if(set.size() == 3){
idx = i;
break;
}
}
PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>(){
public int compare(Integer a, Integer b){
if(a < b)
return 1;
else if(a > b)
return -1;
else
return 0;
}
});
for(int n : set)
pq.offer(n);
if(pq.size() < 3)
return pq.poll();
int first = pq.poll();
int second = pq.poll();
int third = pq.poll();
for(int i = idx + 1; i < l; i++){
if(nums[i] == first || nums[i] == second || nums[i] == third)
continue;
if(nums[i] > first){
third = second;
second = first;
first = nums[i];
}else if(nums[i] > second){
third = second;
second = nums[i];
}else if(nums[i] > third){
third = nums[i];
}
}
return third;
}
}
排序并且降重,TreeSet正合适,但是由于用的比较少,没有想到
然后去看了一下TreeSet中常用的一些方法
first() last() pollFirst() pollLast()
class Solution {
public int thirdMax(int[] nums) {
//去重并且排序
//所以可以直接用TreeSet
TreeSet<Integer> set = new TreeSet<>();
int l = nums.length;
for(int i = 0; i < l; i++){
set.add(nums[i]);
if(set.size() > 3){
set.pollFirst();
}
}
return set.size() == 3 ? set.first() : set.last();
}
}
还可以用Long来赋最小值,然后进行更新,这种方法简单
class Solution {
public int thirdMax(int[] nums) {
long a = Long.MIN_VALUE, b = Long.MIN_VALUE, c = Long.MIN_VALUE;
for (long num : nums) {
if (num > a) {
c = b;
b = a;
a = num;
} else if (a > num && num > b) {
c = b;
b = num;
} else if (b > num && num > c) {
c = num;
}
}
return c == Long.MIN_VALUE ? (int) a : (int) c;
}
}
434. 字符串中的单词数
2021.10.7 每日一题
题目描述
统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。
请注意,你可以假定字符串里不包括任何不可打印的字符。
示例:
输入: “Hello, my name is John”
输出: 5
解释: 这里的单词是指连续的不是空格的字符,所以 “Hello,” 算作 1 个单词。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-segments-in-a-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
class Solution {
public int countSegments(String s) {
int res = 0;
int l = s.length();
for(int i = 0; i < l;){
char c = s.charAt(i);
if(c != ' '){
res++;
i++;
while(i < l && s.charAt(i) != ' ')
i++;
}else{
i++;
}
}
return res;
}
}
正则表达式
不能直接split(" ")
class Solution {
public int countSegments(String s) {
String ss = s.trim();
if (ss.equals("")) {
return 0;
}
return ss.split("\\\\s+").length;
}
}
以上是关于LeetCode 284. 顶端迭代器 / 414. 第三大的数(TreeSet) / 434. 字符串中的单词数的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 284 窥探迭代器[迭代器 构造类] HERODING的LeetCode之路
LeetCode刷题模版:273 - 275278 - 279283 - 284287289 - 290