给定两个字符串形式的非负整数 num1
和num2
,计算它们的和。
注意:
-
num1
和num2
的长度都小于 5100. -
num1
和num2
都只包含数字0-9
. -
num1
和num2
都不包含任何前导零。 -
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
上期的问题是:195,第三大的数
1public int thirdMax(int[] nums) {
2 TreeSet<Integer> set = new TreeSet();
3 for (int num : nums) {
4 set.add(num);
5 if (set.size() > 3)
6 set.pollFirst();
7 }
8 return set.size() > 2 ? set.pollFirst() : set.pollLast();
9}
解析:
TreeSet是有序的,并且元素是不重复的,如果有重复会替换掉, 当他大于3的时候我们把最大的移除掉。我们还可以使用队列来做
1public int thirdMax(int[] nums) {
2 PriorityQueue<Integer> pq = new PriorityQueue<>();
3 Set<Integer> set = new HashSet<>();
4 for (int i : nums) {
5 if (!set.contains(i)) {
6 pq.offer(i);
7 set.add(i);
8 if (pq.size() > 3) {
9 set.remove(pq.poll());
10 }
11 }
12 }
13 if (pq.size() < 3) {
14 while (pq.size() > 1) {
15 pq.poll();
16 }
17 }
18 return pq.peek();
19}
最容易理解 一种方式是用3个变量表示,其中max1表示的是最大 ,max3表示的是最小的。
1public int thirdMax(int[] nums) {
2 Integer max1 = null;
3 Integer max2 = null;
4 Integer max3 = null;
5 for (Integer n : nums) {
6 if (n.equals(max1) || n.equals(max2) || n.equals(max3)) continue;
7 if (max1 == null || n > max1) {
8 max3 = max2;
9 max2 = max1;
10 max1 = n;
11 } else if (max2 == null || n > max2) {
12 max3 = max2;
13 max2 = n;
14 } else if (max3 == null || n > max3) {
15 max3 = n;
16 }
17 }
18 return max3 == null ? max1 : max3;
19}