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. 字符串中的单词数的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode284 窥探迭代器

LeetCode 284 窥探迭代器[迭代器 构造类] HERODING的LeetCode之路

《LeetCode之每日一题》:169.顶端迭代器

LeetCode刷题模版:273 - 275278 - 279283 - 284287289 - 290

LeetCode刷题模版:273 - 275278 - 279283 - 284287289 - 290

顶端迭代器