牛客NC111 最大数【中等 贪心、排序 Java,Go,PHP】

题目

题目链接:

https://www.nowcoder.com/practice/fc897457408f4bbe9d3f87588f497729

思路

复制代码
贪心解法
  对于 numsnums 中的任意两个值 aa 和 bb,
  我们无法直接从常规角度上确定其大小/先后关系。
 但我们可以根据「结果」来决定 aa 和 bb 的排序关系:
 如果拼接结果 abab 要比 baba 好,那么我们会认为 aa 应该放在 bb 前面。
 另外,注意我们需要处理前导零(最多保留一位)。

参考答案Java

java 复制代码
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 最大数
     * @param nums int整型一维数组
     * @return string字符串
     */
    public String solve (int[] nums) {
        /*
            贪心解法
            对于 numsnums 中的任意两个值 aa 和 bb,我们无法直接从常规角度上确定其大小/先后关系。

            但我们可以根据「结果」来决定 aa 和 bb 的排序关系:

            如果拼接结果 abab 要比 baba 好,那么我们会认为 aa 应该放在 bb 前面。

            另外,注意我们需要处理前导零(最多保留一位)。
             */
        int n = nums.length;
        String[] arr = new String[n];
        boolean all0 = true;
        for (int i = 0; i < n ; i++) {
            arr[i] = String.valueOf(nums[i]);
            if (nums[i] != 0 && all0) all0 = false;
        }

        if (all0) return "0";
        Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String a, String b) {
                return (b + a).compareTo(a + b);
            }
        });

        StringBuilder ans = new StringBuilder();
        for (String s : arr) {
            ans.append(s);
        }

        return ans.toString();
    }
}

参考答案Go

go 复制代码
package main

import (
	"sort"
	"strconv"
	"strings"
)

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 最大数
 * @param nums int整型一维数组
 * @return string字符串
 */
func solve(nums []int) string {
	/*
	   贪心解法
	   对于 numsnums 中的任意两个值 aa 和 bb,我们无法直接从常规角度上确定其大小/先后关系。

	   但我们可以根据「结果」来决定 aa 和 bb 的排序关系:

	   如果拼接结果 abab 要比 baba 好,那么我们会认为 aa 应该放在 bb 前面。

	   另外,注意我们需要处理前导零(最多保留一位)。
	*/
	n := len(nums)
	arr := make([]string, n)
	all0 := true

	for i := 0; i < n; i++ {
		arr[i] = strconv.Itoa(nums[i])
		if nums[i] != 0 && all0 {
			all0 = false
		}
	}

	if all0 {
		return "0"
	}

	sort.Slice(arr, func(i, j int) bool {
		return arr[j]+arr[i] <= arr[i]+arr[j]
	})

	var builder strings.Builder
	for _, v := range arr {
		builder.WriteString(v)
	}

	return builder.String()
}

参考答案PHP

php 复制代码
<?php


/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 最大数
 * @param nums int整型一维数组 
 * @return string字符串
 */
function solve( $nums )
{
    /*
     贪心解法
     对于 numsnums 中的任意两个值 aa 和 bb,我们无法直接从常规角度上确定其大小/先后关系。

     但我们可以根据「结果」来决定 aa 和 bb 的排序关系:

     如果拼接结果 abab 要比 baba 好,那么我们会认为 aa 应该放在 bb 前面。

     另外,注意我们需要处理前导零(最多保留一位)。
      */

    $n = count($nums);
    $arr = array();
    $all0 = true;
    for($i=0;$i<$n;$i++){
        $arr[$i]= $nums[$i].'';
        if($nums[$i] != 0 && $all0){
            $all0=false;
        }
    }

    if ($all0) return '0';

    usort($arr,function ($a,$b){
       return $b.$a >= $a.$b;
    });

    $ans = '';
    foreach ($arr as $v){
        $ans.=$v;
    }

    return $ans;
}
相关推荐
ffqws_2 分钟前
A*算法:P5507 机关 题解
算法
执着25924 分钟前
力扣hot100 - 108、将有序数组转换为二叉搜索树
算法·leetcode·职场和发展
2501_9011478326 分钟前
学习笔记:单调递增数字求解的迭代优化与工程实践
linux·服务器·笔记·学习·算法
AI科技星28 分钟前
张祥前统一场论核心场方程的经典验证-基于电子与质子的求导溯源及力的精确计算
线性代数·算法·机器学习·矩阵·概率论
kebijuelun34 分钟前
ERNIE 5.0:统一自回归多模态与弹性训练
人工智能·算法·语言模型·transformer
历程里程碑1 小时前
普通数组----最大子数组和
大数据·算法·elasticsearch·搜索引擎·排序算法·哈希算法·散列表
52Hz1181 小时前
力扣230.二叉搜索树中第k小的元素、199.二叉树的右视图、114.二叉树展开为链表
python·算法·leetcode
苦藤新鸡1 小时前
56.组合总数
数据结构·算法·leetcode
LiLiYuan.2 小时前
【Cursor 中找不到LeetCode 插件解决办法】
算法·leetcode·职场和发展