牛客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;
}
相关推荐
索迪迈科技1 小时前
Flink Task线程处理模型:Mailbox
java·大数据·开发语言·数据结构·算法·flink
元亓亓亓2 小时前
LeetCode热题100--230. 二叉搜索树中第 K 小的元素--中等
算法·leetcode·职场和发展
草莓熊Lotso2 小时前
《算法闯关指南:优选算法-双指针》--01移动零,02复写零
c语言·c++·经验分享·算法·leetcode
焜昱错眩..3 小时前
代码随想录算法训练营第三十九天|62.不同路径 63.不同路径ll
算法
焦耳加热7 小时前
阿德莱德大学Nat. Commun.:盐模板策略实现废弃塑料到单原子催化剂的高值转化,推动环境与能源催化应用
人工智能·算法·机器学习·能源·材料工程
wan5555cn7 小时前
多张图片生成视频模型技术深度解析
人工智能·笔记·深度学习·算法·音视频
u6067 小时前
常用排序算法核心知识点梳理
算法·排序
蒋星熠10 小时前
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
开发语言·python·算法·flutter·设计模式·性能优化·硬件工程
小欣加油10 小时前
leetcode 面试题01.02判定是否互为字符重排
数据结构·c++·算法·leetcode·职场和发展
3Cloudream10 小时前
LeetCode 003. 无重复字符的最长子串 - 滑动窗口与哈希表详解
算法·leetcode·字符串·双指针·滑动窗口·哈希表·中等