牛客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;
}
相关推荐
努力中的编程者10 分钟前
二叉树(C语言底层实现)
c语言·开发语言·数据结构·c++·算法
鹤旗24 分钟前
While语句,do-while语句,for语句
java·jvm·算法
qq_4160187225 分钟前
高性能密码学库
开发语言·c++·算法
NAGNIP27 分钟前
一文搞懂卷积神经网络经典架构-LeNet
算法·面试
宵时待雨36 分钟前
C++笔记归纳14:AVL树
开发语言·数据结构·c++·笔记·算法
NAGNIP42 分钟前
一文搞懂深度学习中的池化!
算法·面试
山川行1 小时前
关于《项目C语言》专栏的总结
c语言·开发语言·数据结构·vscode·python·算法·visual studio code
yangSimaticTech2 小时前
整型数据的转换与比较并不简单
算法
老鼠只爱大米2 小时前
LeetCode经典算法面试题 #55:跳跃游戏(贪心法、动态规划、BFS等多种实现方案详解)
算法·leetcode·贪心算法·动态规划·bfs·java面试·跳跃游戏