美文网首页算法
IOS 算法(基础篇) ----- 找出 3 位偶数

IOS 算法(基础篇) ----- 找出 3 位偶数

作者: ShawnAlex | 来源:发表于2021-12-08 16:32 被阅读0次

给你一个整数数组 digits ,其中每个元素是一个数字(0 - 9)。数组中可能存在重复元素。
你需要找出 所有 满足下述条件且 互不相同 的整数:
该整数由 digits 中的三个元素按 任意 顺序 依次连接 组成。
该整数不含 前导零
该整数是一个 偶数
例如,给定的 digits 是 [1, 2, 3] ,整数 132 和 312 满足上面列出的全部条件。
将找出的所有互不相同的整数按 递增顺序 排列,并以数组形式返回。
其中:
3 <= digits.length <= 100
0 <= digits[i] <= 9

例子

输入: digits = [2,1,3,0]
输出: [102,120,130,132,210,230,302,310,312,320]
解释:
所有满足题目条件的整数都在输出数组中列出。
注意,答案数组中不含有 奇数 或带 前导零 的整数。

输入:digits = [2,2,8,8,2]
输出:[222,228,282,288,822,828,882]
解释:
同样的数字(0 - 9)在构造整数时可以重复多次,重复次数最多与其在 digits 中出现的次数一样。
在这个例子中,数字 8 在构造 288、828 和 882 时都重复了两次。

输入:digits = [3,7,5]
输出:[]
解释:
使用给定的 digits 无法构造偶数。

输入:digits = [0,2,0,0]
输出:[200]
解释:
**唯一一个不含 前导零 且满足全部条件的整数是 200 。

输入:digits = [0,0,0]
输出:[]
解释:
构造的所有整数都会有 前导零 。因此,不存在满足题目条件的整数。

解题思路

题意稍微解释下, 给你个数组, 找出所有不重复, 3位(不含前导0), 偶数
其实这道题有个很巧妙的解法, 我们只需要遍历100 ~ 998中所有偶数, 找到不重复且每一位都在数组中元素即可

  • 遍历数组digits, 找到每个元素出现个数
  • 遍历100 ~ 998中所有偶数, 每一位元素个数都小于出现次数的3位数

例如: [2,1,3,0]

  • 每一位出现次数用数组表示[1, 1, 1, 1, 0, 0, 0, 0, 0, 0], 也可用字典表示 {0:1, 1:1 ... 8:0, 9:0}
  • 遍历100 ~ 998中所有偶数, 例如 100, 2个0不满足, 102满足....

代码

未翻译版
class Solution {
    func findEvenNumbers(_ digits: [Int]) -> [Int] {
        var arr = Array(repeating: 0, count: 10), res = [Int](), i = 100
        for i in digits { arr[i] += 1 }
        while i < 999 {
            var temp = arr, now = i
            for j in 0..<3 {
                let y = now % 10
                now /= 10
                if temp[y] == 0 { break }
                if j == 2 { res.append(i) }
                temp[y] -= 1
            }
            i += 2
        }
        return res;
    }
}
翻译版
class Solution {
    func findEvenNumbers(_ digits: [Int]) -> [Int] {

        // 定义 arr 为计数数组, 当然这里也可用字典计数
        // res为结果, 遍历参数i
        var arr = Array(repeating: 0, count: 10), res = [Int](), i = 100

        // 遍历 digits 得到每一位出现次数, 
        for i in digits { arr[i] += 1 }

        // 循环 100 ~ 998 中的数
        while i < 999 {

            // 定义temp = arr now为当前元素
            var temp = arr, now = i

            // 做3次取余数, 其实目的就是找到每一位元素
            for j in 0..<3 {
                
                // 取余, 当前元素除10
                let y = now % 10
                now /= 10
             
                // 如果出现次数不满足break弹出
                if temp[y] == 0 { break }
                
                // 3位都满足, 则添加
                if j == 2 { res.append(i) }

                // 对应出现次数 - 1
                temp[y] -= 1
            }

            // 确保是偶数 i = i + 2
            i += 2
        }

        // 返回结果
        return res;
    }
}

题目来源:力扣(LeetCode) 感谢力扣爸爸 :)
IOS 算法合集地址

相关文章

网友评论

    本文标题:IOS 算法(基础篇) ----- 找出 3 位偶数

    本文链接:https://www.haomeiwen.com/subject/zyutfrtx.html