牛客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;
}
相关推荐
屈冠成6 小时前
C语言数组:编辑世界的坚固桥梁
c语言·开发语言·算法
应用市场6 小时前
STM32卡尔曼滤波算法详解与实战应用
人工智能·stm32·算法
启诚科技6 小时前
树上二分(树的重心)
c++·算法·二分·树的重心
风筝在晴天搁浅6 小时前
代码随想录 617.合并二叉树
数据结构·算法
AICodeThunder7 小时前
【S组篇】C++知识点总结(1):并查集基础
c语言·数据结构·c++·算法·图论
南方的狮子先生7 小时前
【逻辑回归】从线性模型到逻辑回归
算法·机器学习·逻辑回归
闻缺陷则喜何志丹7 小时前
【排序】P9127 [USACO23FEB] Equal Sum Subarrays G|普及+
c++·算法·排序·洛谷
Code_Shark7 小时前
AtCoder Beginner Contest 424 题解
数据结构·c++·算法·数学建模·青少年编程
CS创新实验室8 小时前
深入解析快速排序(Quicksort):从原理到实践
数据结构·算法·排序算法·快速排序
Theodore_10229 小时前
深度学习(3)神经网络
人工智能·深度学习·神经网络·算法·机器学习·计算机视觉