给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。

示例 1:

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

示例 2:

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

示例 3:

输入: [2, 2, 3, 1]
输出: 1
解释: 注意,要求返回第三大的数,是指第三大且唯一出现的数。
存在两个值为2的数,它们都排第二。

上期的问题是:194,Fizz Buzz

 1public List<String> fizzBuzz(int n) {
 2    List<String> ret = new ArrayList<>(n);
 3    for (int i = 1, fizz = 0, buzz = 0; i <= n; i++) {
 4        fizz++;
 5        buzz++;
 6        if (fizz == 3 && buzz == 5) {
 7            ret.add("FizzBuzz");
 8            fizz = 0;
 9            buzz = 0;
10        } else if (fizz == 3) {
11            ret.add("Fizz");
12            fizz = 0;
13        } else if (buzz == 5) {
14            ret.add("Buzz");
15            buzz = 0;
16        } else {
17            ret.add(String.valueOf(i));
18        }
19    }
20    return ret;
21}

解析:

这题难度很小,下面再看另外两种写法

 1public List<String> fizzBuzz(int n) {
 2    List<String> output = new ArrayList<String>();
 3    for (int i = 1; i <= n; i++) {
 4        if (i % 15 == 0) {
 5            output.add("FizzBuzz");
 6        } else {
 7            if (i % 3 == 0)
 8                output.add("Fizz");
 9            else if (i % 5 == 0)
10                output.add("Buzz");
11            else
12                output.add(Integer.toString(i));
13        }
14    }
15    return output;
16}
 1public List<String> fizzBuzz(int n) {
 2    List<String> res = new ArrayList<>(n);
 3    for (int i = 1; i <= n; i++) {
 4        res.add(i + "");
 5    }
 6    for (int i = 2; i < n; i += 3) {
 7        res.set(i, "Fizz");
 8    }
 9    for (int i = 4; i < n; i += 5) {
10        res.set(i, "Buzz");
11    }
12    for (int i = 14; i < n; i += 15) {
13        res.set(i, "FizzBuzz");
14    }
15    return res;
16}

注意res中的i是list的下标索引,是从0开始的,而我们输出的数字是从1开始的。