当前位置: 面试刷题>> 将数组重新排列以构建最小值 (经典算法题500道)


题目描述补充

题目:将数组重新排列以构建最小值

给定一个包含正整数和负整数的数组,你需要重新排列这些数字(可以改变它们的相对顺序),使得重新排列后的数组按照从左到右的顺序读取时,能够得到一个尽可能小的数。例如,数组 [3, 30, 34, 5, 9] 可以被重新排列为 [3, 3, 5, 9, 34],这样形成的数 335934 是最小的。

注意,返回的结果应当是一个数字字符串形成的表示,而不是数字本身,因为结果可能非常大,超出了标准整数类型的表示范围。

示例

输入:[3, 30, 34, 5, 9] 输出:"335934"

输入:[-10, -5, 0, 0, 5] 输出:"-10-50005"

PHP 代码示例

function minNumber($nums) {
    // 自定义排序函数,先按数字绝对值升序排序,若绝对值相同则按原数字降序排序
    usort($nums, function($a, $b) {
        if (abs($a) == abs($b)) {
            return $b - $a;
        }
        return abs($a) - abs($b);
    });

    // 将排序后的数组转换为字符串
    $result = implode('', $nums);
    return $result;
}

// 测试
echo minNumber([3, 30, 34, 5, 9]); // 输出 335934
echo minNumber([-10, -5, 0, 0, 5]); // 输出 -10-50005

Python 代码示例

def minNumber(nums):
    # 使用自定义排序函数
    nums.sort(key=lambda x: (-x if x < 0 else x, str(x)))
    # 将排序后的列表转换为字符串
    return ''.join(map(str, nums))

# 测试
print(minNumber([3, 30, 34, 5, 9]))  # 输出 335934
print(minNumber([-10, -5, 0, 0, 5]))  # 输出 -10-50005

JavaScript 代码示例

function minNumber(nums) {
    // 使用自定义排序函数
    nums.sort((a, b) => {
        if (Math.abs(a) === Math.abs(b)) {
            return b - a;
        }
        return Math.abs(a) - Math.abs(b);
    });

    // 将排序后的数组转换为字符串
    return nums.join('');
}

// 测试
console.log(minNumber([3, 30, 34, 5, 9])); // 输出 335934
console.log(minNumber([-10, -5, 0, 0, 5])); // 输出 -10-50005

码小课 网站中有更多关于排序算法、字符串处理及数组操作的相关内容分享,欢迎大家学习交流。

推荐面试题