给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是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开始的。