列表

详情


6327. 从两个数字数组里生成最小数字

给你两个只包含 1 到 9 之间数字的数组 nums1 和 nums2 ,每个数组中的元素 互不相同 ,请你返回 最小 的数字,两个数组都 至少 包含这个数字的某个数位。

 

示例 1:

输入:nums1 = [4,1,3], nums2 = [5,7]
输出:15
解释:数字 15 的数位 1 在 nums1 中出现,数位 5 在 nums2 中出现。15 是我们能得到的最小数字。

示例 2:

输入:nums1 = [3,5,2,6], nums2 = [3,1,7]
输出:3
解释:数字 3 的数位 3 在两个数组中都出现了。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int minNumber(vector<int>& nums1, vector<int>& nums2) { } };

php 解法, 执行用时: 0 ms, 内存消耗: 18.7 MB, 提交时间: 2023-09-05 07:42:09

class Solution {

    /**
     * @param Integer[] $nums1
     * @param Integer[] $nums2
     * @return Integer
     */
    function minNumber($nums1, $nums2) {
        usort($nums1, function($a, $b) {
           return $a > $b ? 1 : -1; 
        });
        usort($nums2, function($a, $b) {
           return $a > $b ? 1 : -1; 
        });
        for ( $i = 1; $i <= 9; $i++ ) {
            if ( in_array($i, $nums1) && in_array($i, $nums2) ) return $i;
        }
        return min($nums1[0] * 10 + $nums2[0], $nums1[0] + $nums2[0] * 10);
    }
}

javascript 解法, 执行用时: 64 ms, 内存消耗: 42.3 MB, 提交时间: 2023-04-02 11:18:41

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number}
 */

var minNumber = function(nums1, nums2) {
  nums1.sort((a, b) => a - b);
  nums2.sort((a, b) => a - b);
  for (let i = 1; i <= 9; i++) {
    if (nums1.includes(i) && nums2.includes(i)) {
      return i;
    }
  }
  return Math.min(nums1[0] * 10 + nums2[0], nums2[0] * 10 + nums1[0]);
};

golang 解法, 执行用时: 4 ms, 内存消耗: 2 MB, 提交时间: 2023-04-02 11:17:43

// 位运算
func minNumber(nums1, nums2 []int) int {
	var mask1, mask2 uint
	for _, x := range nums1 { mask1 |= 1 << x }
	for _, x := range nums2 { mask2 |= 1 << x }
	if m := mask1 & mask2; m > 0 {
		return bits.TrailingZeros(m)
	}
	x, y := bits.TrailingZeros(mask1), bits.TrailingZeros(mask2)
	return min(x*10+y, y*10+x)
}

func min(a, b int) int { if b < a { return b }; return a }

cpp 解法, 执行用时: 4 ms, 内存消耗: 21.2 MB, 提交时间: 2023-04-02 11:17:20

class Solution {
public:
    int minNumber(vector<int> &nums1, vector<int> &nums2) {
        int mask1 = 0, mask2 = 0;
        for (int x: nums1) mask1 |= 1 << x;
        for (int x: nums2) mask2 |= 1 << x;
        int m = mask1 & mask2;
        if (m) return __builtin_ctz(m);
        int x = __builtin_ctz(mask1), y = __builtin_ctz(mask2);
        return min(x * 10 + y, y * 10 + x);
    }
};

java 解法, 执行用时: 0 ms, 内存消耗: 39.6 MB, 提交时间: 2023-04-02 11:17:08

class Solution {
    public int minNumber(int[] nums1, int[] nums2) {
        int mask1 = 0, mask2 = 0;
        for (int x : nums1) mask1 |= 1 << x;
        for (int x : nums2) mask2 |= 1 << x;
        int m = mask1 & mask2;
        if (m > 0) return Integer.numberOfTrailingZeros(m);
        int x = Integer.numberOfTrailingZeros(mask1);
        int y = Integer.numberOfTrailingZeros(mask2);
        return Math.min(x * 10 + y, y * 10 + x);
    }
}

python3 解法, 执行用时: 36 ms, 内存消耗: 15 MB, 提交时间: 2023-04-02 11:16:53

'''
有交集,则取最小的交集,否则取两个数组中各自的最小数
'''
class Solution:
    def minNumber(self, nums1: List[int], nums2: List[int]) -> int:
        s1, s2 = set(nums1), set(nums2)
        s = s1 & s2
        if s: return min(s)
        x, y = min(nums1), min(nums2)
        return min(x * 10 + y, y * 10 + x)

上一题