将整数转换为两个无零整数的和

102 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 34 天,点击查看活动详情

问题描述

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

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

  • A 和 B 都是无零整数
  • A + B = n

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

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

示例 1:

输入: n = 2
输出: [1,1]
解释: A = 1, B = 1. A + B = n 并且 AB 的十进制表示形式都不包含任何 0

示例 2:

输入: n = 11
输出: [2,9]

示例 3:

输入: n = 10000
输出: [1,9999]

示例 4:

输入: n = 69
输出: [1,68]

示例 5:

输入: n = 1010
输出: [11,999]

提示:

  • 2 <= n <= 10^4

思路分析

首先我们要先理解一下题目的意思,题目会给我们一个正整数,我们需要将整数转换为两个无零整数的和,这里的无零整数指的是:十进制表示中 不含任何 0 的正整数,返回两个无零整数组成的列表[A,B],A,B需要满足以下条件:

  • A 和 B 都是无零整数
  • A + B = n

我们可以直接遍历小于n的整数i,判断in-i是否都为无零整数即可。

  • 判断是否无零整数

将数字转换成字符串,再使用字符串的includes方法即可判断当前整数是否为无零整数。

const has0 = (str) => {
    return str.includes('0');
};
  • 遍历取值

遍历小于n的整数i,设A = i,则B = n - i,我们只需要判断in-i是否都为无零整数即可,如果都为无零整数,则可直接返回答案。

for(let i = 1; i < n; i++){
    if(!has0(i + '') && !has0(n - i + '')){
        return [i,n-i];
    }
}

AC 代码

完整代码如下:

/**
 * @param {number} n
 * @return {number[]}
 */
var getNoZeroIntegers = function(n) {
    const has0 = (str) => {
        return str.includes('0');
    };
    for(let i = 1; i < n; i++){
        if(!has0(i + '') && !has0(n - i + '')){
            return [i,n-i];
        }
    }
    return [];
};

说在后面

本人为算法业余爱好者,平时只是随着兴趣偶尔刷刷题,如果上面分享有错误的地方,欢迎指出,感激不尽。