java解法
解题思路 输入处理: 使用 Scanner 读取用户输入,输入是由逗号分隔的数字字符串。通过 scanner.next().split(“,”) 将输入按逗号分割成一个字符串数组 numbers。
自定义排序: 代码中的核心是自定义排序,使用 Arrays.sort 对字符串数组进行排序。排序的规则是:
比较两个字符串 x 和 y 时,我们构造出 x + y 和 y + x 两个新的字符串。如果 y + x 字符串字典序较小(即在排序时应该排在前面),则 x 排在 y 前面;否则,y 排在 x 前面。 这种方式是通过 compareTo 方法来实现的,比较的是两个字符串拼接后的字典顺序,从而达到构建最大数字的目的。 构建最终的数字: 排序完成后,通过一个 StringBuilder 来拼接排序后的字符串数组,形成最终的最大数字。
输出结果: 使用 System.out.println(maxNumber.toString()) 输出拼接后的字符串
import java. util. * ;
public class Main {
public static void main ( String [ ] args) {
Scanner scanner = new Scanner ( System . in) ;
String [ ] numbers = scanner. next ( ) . split ( "," ) ;
Arrays . sort ( numbers, new Comparator < String > ( ) {
@Override
public int compare ( String x, String y) {
return ( y + x) . compareTo ( x + y) ;
}
} ) ;
StringBuilder maxNumber = new StringBuilder ( ) ;
for ( String number : numbers) {
maxNumber. append ( number) ;
}
System . out. println ( maxNumber. toString ( ) ) ;
}
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
C++解法
程序首先使用 getline 读取整行输入,并存储在 inp 字符串中。 然后,使用 stringstream 来按逗号分隔 inp 字符串,将分隔后的子串存入 vector 类型的数组 arr 中。 自定义排序:
cmp 函数用于自定义排序规则。它通过比较两个字符串拼接的结果 b + a 和 a + b 来判断哪个字符串应该排在前面。通过这种方式,可以确保将较大的数字排在前面。 构建最终的数字:
排序后的字符串数组通过遍历拼接成一个最终的大字符串 res。 输出拼接后的结果。 返回结果:
输出拼接后的字符串,即构成的最大数字
# include
# include
# include
# include
# include
using namespace std;
bool cmp ( const string& a, const string& b) {
return ( b + a) < ( a + b) ;
}
int main ( ) {
string inp;
getline ( cin, inp) ;
vector< string> arr;
stringstream ss ( inp) ;
string tok;
while ( getline ( ss, tok, ',' ) ) {
arr. push_back ( tok) ;
}
sort ( arr. begin ( ) , arr. end ( ) , cmp) ;
string res;
for ( const auto & s : arr) {
res += s;
}
cout << res << endl;
return 0 ;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
C解法
更新中
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
JS解法
解题思路 输入处理: 使用 readline 模块来读取用户输入。输入是由逗号分隔的数字字符串(例如,3,30,34,5,9)。
排序: 对数组中的字符串按照自定义的规则进行排序。我们希望通过比较两个字符串拼接后的结果 b + a 和 a + b 来决定它们的顺序。这是为了确保拼接后的结果能够形成最大数字。
拼接结果: 排序完成后,数组中的元素按照排序后的顺序拼接成一个大字符串。如果拼接结果是一个以 0 开头的字符串(例如,[“0”, “0”]),则返回 “0”;否则返回拼接后的结果。
输出: 输出最终拼接后的字符串,即最大数字。
const readline = require ( "readline" ) ;
const rl = readline. createInterface ( {
input : process. stdin,
output : process. stdout,
} ) ;
rl. on ( "line" , ( line ) => {
const nums = line. split ( "," ) ;
console. log ( createLargestNumber ( nums) ) ;
} ) ;
function createLargestNumber ( nums ) {
nums. sort ( ( a, b ) => {
return ( b + a) . localeCompare ( a + b) ;
} ) ;
return nums. reduce ( ( acc, curr ) => acc + curr, "" ) || "0" ;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。 解题不易,如对您有帮助,欢迎点赞/收藏
评论记录:
回复评论: