LeetCode Record – 7, 8

25 – 09 – 07 (补于 25 – 09 – 11)

关于 Leetcode 可怜孩子做不出来 CUMCM 所以放一天水这件事

今日份题面:

给你一个整数 n,请你返回 任意 一个由 n 个 各不相同 的整数组成的数组,并且这 n 个数相加和为 0 。

这题水到了什么程度呢?他甚至仁慈的不要求数组中不能有 0,这样对于总数为奇数的数组甚至都不用考虑特别构造一下最后一个数了。

直接上代码

class Solution {
    public int[] sumZero(int n) {
        int[] a = new int[n];
        int m = n / 2;
        for (int i = 0; i < m; i++) {
            a[i] = i + 1;
            a[i + m] = -i - 1;
        }
        return a;
    }
}

以上


25 – 09 – 08 (补于 25 – 09 – 11)

今日份题面

「无零整数」是十进制表示中 不含任何 0 的正整数。

给你一个整数 n,请你返回一个 由两个整数组成的列表 [a, b],满足:

  • a 和 b 都是无零整数
  • a + b = n

题目数据保证至少有一个有效的解决方案。

如果存在多个有效解决方案,你可以返回其中任意一个。

由于这题数据范围很小($[0, 10^4]$),所以即使是从头开始暴力遍历然后一个一个看有没有 0 也能过,所以这题给到了简单。但我们考虑一种更为通俗的解法:构造

因为结果要求返回两个数,所以最简单的想法就是对当前数进行二分,但显然单纯二分并不能很好的满足 a 和 b 都是无零整数这一要求,比如 100 的二分结果是 50 这显然含 0 .

所以我们考虑不是对数字进行二分,而是对数位进行二分,对于 $\gt 1$ 的个位数,其二分结果必不为零。而 $\leq 1$ 的数,我们可以通过借位这一操作使其变为 10 和 11 之后再进行二分。

思路可行,那么实现起来就很简单了:

class Solution {
    public int[] getNoZeroIntegers(int n) {
        int a = 0;
        int digital = 1; // 10^k
        for (int x = n; x > 1; x /= 10) {
            int d = x % 10;
            if (d <= 1) {
                d += 10;
                x -= 10; // 借位
            }
            // 填充当前位
            a += d / 2 * digital;
            digital *= 10;
        }
        return new int[]{a, n - a};
    }
}

以上

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注