牛客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;
}
相关推荐
志起计算机编程5 小时前
Clickhouse的几个关键优势
算法
重生之小比特5 小时前
【算法拾光 7】双指针|两数之和 II - 输入有序数组 + 三数之和
算法
Navigator_Z5 小时前
LeetCode //C - 1304. Find N Unique Integers Sum up to Zero
c语言·算法·leetcode
企业数字化笔记16 小时前
视频人体姿态怎么做三维可视化?2D关键点、深度局限与技术选型
人工智能·算法·音视频
?abc!17 小时前
(数组)581. 最短无序连续子数组
数据结构·算法·leetcode
小郎君65820 小时前
MPTT树复选框的半选状态:一棵百万节点树从递归到计数器,再到区间覆盖
算法
酌沧20 小时前
MemT让记忆成为模型内生能力
jvm·人工智能·算法
Shimeri20 小时前
越卷越像:我用遗传算法做了个"内卷"实验
算法·three.js·数据可视化·遗传算法·进化算法
Evand J21 小时前
【PMSM例程1】永磁同步电机(PMSM)转速与转子电角度观测算法|基于扩展卡尔曼滤波(EKF)的传感器状态估计与误差。附下载链接
算法·电机·1024程序员节·卡尔曼滤波