给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。

注意:

  1. num1 和num2 的长度都小于 5100.

  2. num1 和num2 都只包含数字 0-9.

  3. num1 和num2 都不包含任何前导零。

  4. 你不能使用任何內建 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}