找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 65698|回复: 33

[挑战题]Largest Number

[复制链接]
发表于 2016-8-23 10:22:13 | 显示全部楼层 |阅读模式
本帖最后由 523066680 于 2016-8-23 10:52 编辑

这里有一个算法竞赛网站出的题目 https://leetcode.com/problems/largest-number/

你可以选自己擅长的语言做题并上传代码,该网站会用各种极端情况的输入值测试你的代码,如果没有出错,则同其他人上传的代码效率做比较、排名

问题179. Largest Number
  1. Given a list of non negative integers, arrange them such that they form the largest number.

  2. For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330.

  3. Note: The result may be very large, so you need to return a string instead of an integer.

  4. Credits:
  5. Special thanks to @ts for adding this problem and creating all test cases.

  6. Subscribe to see which companies asked this question
复制代码
以下是本人渣翻译

  1. 给出一系列正整数,对这些数进行排列,使其拼凑出一个尽可能大(最大)的数。

  2. 例如,给出[3, 30, 34, 5, 9],则这些数所能拼凑出的最大数字是 9534330。

  3. 注:给出的数组元素数量不定,结果可能非常非常大,所以你需要将结果作为字符串返回而不是int类型的整数(尤其是对于那些强类型的语言)
复制代码
可惜可以在该网站上传测试的语言类型有限,C/C++, java, python, ruby, js, go
 楼主| 发表于 2016-8-23 10:47:00 | 显示全部楼层
本帖最后由 523066680 于 2016-8-23 10:57 编辑

本人上一次用C挑战的结果。测试221种输入情况累计用时 4ms-6ms




某群里最快的是0ms-2ms区间,C语言 (据说用语法糖越多的语言用时越多
发表于 2016-8-23 18:41:57 | 显示全部楼层
本帖最后由 CrLf 于 2016-8-23 19:16 编辑

JavaScript 136ms:
  1. var largestNumber = function(nums) {
  2.         return [].join.call(arguments)
  3.         .split(',')
  4.         .sort(function(a,b){
  5.                 return b+a > (a+b) ? 1 : -1
  6.         })
  7.         .join('').replace(/^0+(.)/,'$1')
  8. }
复制代码
不懂那些更快的是怎么实现的,好想看一看...
 楼主| 发表于 2016-8-23 18:51:18 | 显示全部楼层
本帖最后由 523066680 于 2016-8-23 19:02 编辑

回复 3# CrLf


    更快的当然是把那些sort函数之类的自己用更底层的语言实现啦。
好消息是我之前编译能过的代码现在不仅测试不通过而且本地编译运行崩溃,哈哈哈哈
发表于 2016-8-23 19:04:12 | 显示全部楼层
回复 4# 523066680


    JavaScript 组有人是 120ms,比我快多了,实在想不出来他把时间省在哪里了
    回头我也用c玩一个
发表于 2016-8-23 20:46:19 | 显示全部楼层
本帖最后由 pcl_test 于 2016-8-23 20:56 编辑
  1. #*&cls&gawk -f "%~f0"&pause&exit

  2. BEGIN{
  3.     str="3,30,34,5,9"
  4.     split(str,a,",");
  5.     if(length(a)==1){
  6.         print a[1];
  7.     }else{
  8.         if(str~/^[0,]*$/){
  9.             print 0;
  10.         }else{
  11.             for(i=1;i<=length(a);i++){
  12.                 if(a[i]~/^0+[1-9][0-9]*$/){
  13.                     sub(/^0+/,"",a[i]);
  14.                 }else{
  15.                     if(a[i]~/^0+$/)sub(/0+/,"0",a[i]);
  16.                 }
  17.                 t=a[i];
  18.                 j=i-1;
  19.                 while(j>=1&&(!comp(a[j],t))){
  20.                     a[j+1]=a[j];
  21.                     j--;
  22.                 }
  23.                 a[j+1]=t;
  24.             }
  25.             for(i=1;i<=length(a);i++)s=s""a[i];
  26.             print s;
  27.         }
  28.     }
  29. }
  30. function comp(a,b){return (a""b)*1>(b""a)*1?1:0;}
复制代码

评分

参与人数 1PB +6 收起 理由
523066680 + 6 类C

查看全部评分

发表于 2016-8-23 23:33:13 | 显示全部楼层
本帖最后由 xxpinqz 于 2016-8-24 12:57 编辑

  1. @echo off&setlocal enabledelayedexpansion
  2. set "s=89 89891 830 8308 8300 89899 9 999999999999999999999 9999999999999999999999999999"
  3. for %%a in (%s%) do (
  4.     set "a=%%a%%a%%a%%a%%a%%a%%a%%a%%a!random!"
  5.     set #!a!=%%a
  6. )
  7. (for /f "tokens=2 delims==" %%a in ('set # ^|sort /r') do set/p.=%%a)<nul
  8. pause
复制代码
变量a受最长的数值影响。。。。。。

评分

参与人数 1技术 +1 收起 理由
happy886rr + 1 几乎批处理不可能的,一个sort就完事了

查看全部评分

发表于 2016-8-24 02:43:58 | 显示全部楼层
回复 2# 523066680


    看完夜场谍影重重,回家撸了C语言
221 / 221 test cases passed.
Status: Accepted
Runtime: 0 ms

还不下跪

评分

参与人数 1PB +12 收起 理由
523066680 + 12 斯国一

查看全部评分

 楼主| 发表于 2016-8-24 08:31:54 | 显示全部楼层
本帖最后由 523066680 于 2016-8-24 08:42 编辑

回复 7# xxpinqz


    当输入数字是 830 8308 时,显示结果为:8308
发表于 2016-8-24 09:21:50 | 显示全部楼层
JavaScript 124ms:
  1. var largestNumber = function(nums) {
  2.     var arr = [];
  3.     [].forEach.call(arguments,function(a){a.map?[].push.apply(arr,a):arr.push(a)})
  4.         return arr
  5.             .sort(function(a,b){
  6.                     return ''+b+a > ''+a+b ? 1 : -1
  7.             })
  8.             .join('').replace(/^0+(.)/,'$1')
  9. }
复制代码
C语言 0ms:
  1. char* largestNumber(int* nums, int numsSize) {
  2.         struct struct_num{
  3.                 int digit;
  4.                 int number;
  5.         };

  6.         struct struct_num *group[10][100], *pg, *pg2;
  7.         int group_count[10]={0,0,0,0,0,0,0,0,0,0};
  8.         int i,j,k;
  9.         int number,index,digit;
  10.         char output[10000]="0";
  11.         char *p=output;

  12.         const char itoa_map[11]="0123456789";

  13.         for(i=numsSize;i--;){
  14.                 number = nums[i];

  15.                 for(digit=10;number>=digit;digit*=10){}
  16.                 index = number/(digit/10);

  17.                 pg=(struct struct_num *)malloc(sizeof(struct struct_num));

  18.                 group[index][group_count[index]++]=pg;
  19.                 (pg)->number = number;
  20.                 (pg)->digit = digit;
  21.         }

  22.         for(i=10;i--;){
  23.                 for(j=group_count[i];j-->0;){
  24.                         pg = group[i][j];

  25.                         for(k=j;k-->0;){
  26.                                 pg2 = group[i][k];
  27.                                 if(
  28.                                         ((long long) pg->number * pg2->digit+pg2->number)< ((long long) pg2->number * pg->digit + pg->number)
  29.                                 ){
  30.                                         * (long long*) pg ^= * (long long*) pg2;
  31.                                         * (long long*) pg2 ^= * (long long*) pg;
  32.                                         * (long long*) pg ^= * (long long*) pg2;
  33.                                 }
  34.                         }
  35.                 }
  36.                 for(j=group_count[i];j--;){
  37.                         pg = group[i][j];
  38.                         number = pg->number;
  39.                         digit = pg->digit / 10;
  40.                         while(digit >= 1){
  41.                                 *p++ = itoa_map[number / digit % 10];
  42.                                 digit /= 10;
  43.                         }
  44.                         free(pg);
  45.                 }
  46.         }
  47.         if(output[0]=='0')return "0";

  48.         *p='\0';

  49.         return output;
  50. }
复制代码

评分

参与人数 2技术 +2 收起 理由
happy886rr + 1 大师的代码如此深奥
523066680 + 1 先顶

查看全部评分

 楼主| 发表于 2016-8-24 10:07:30 | 显示全部楼层
大家都习惯花括号不换行吗……
发表于 2016-8-24 12:58:48 | 显示全部楼层
回复 9# 523066680

嗯,不截取就好,我干嘛去截取。谢谢!
发表于 2016-8-24 13:01:47 | 显示全部楼层
回复 8# CrLf

听说谍影系列不适合看3d版。。。晃不
没影院放2d的。
 楼主| 发表于 2016-8-24 14:39:59 | 显示全部楼层

转一个别人的代码


  1. #define _CRT_SECURE_NO_WARNINGS

  2. #include <stdint.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <stdio.h>

  6. int Comparer(char * strLeft, char * strRight)
  7. {
  8.         char * cmpLeft = strLeft;
  9.         char * cmpRight = strRight;
  10.         for (;; ++cmpLeft, ++cmpRight)
  11.         {
  12.                 char chLeft = *cmpLeft;
  13.                 char chRight = *cmpRight;

  14.                 if (!chLeft && !chRight)
  15.                         return 0;

  16.                 if (!chLeft)
  17.                 {
  18.                         cmpLeft = strRight;
  19.                         chLeft = *cmpLeft;
  20.                 }

  21.                 if (!chRight)
  22.                 {
  23.                         cmpRight = strLeft;
  24.                         chRight = *cmpRight;
  25.                 }

  26.                 if (chLeft == chRight)
  27.                         continue;
  28.                 else
  29.                         return chLeft > chRight;
  30.         }
  31.         return 0;
  32. }

  33. void QS_Swap(char ** left, char ** right)
  34. {
  35.         char * tmp = *left;
  36.         *left = *right;
  37.         *right = tmp;
  38. }

  39. int QS_Partition(char ** arr, int lo, int hi)
  40. {
  41.         char * pivot = arr[hi];
  42.         int i = lo;

  43.         for (int j = lo; j < hi; ++j)
  44.         {
  45.                 if (Comparer(arr[j], pivot))
  46.                 {
  47.                         QS_Swap(&arr[i], &arr[j]);
  48.                         ++i;
  49.                 }
  50.         }
  51.         QS_Swap(&arr[i], &arr[hi]);
  52.         return i;
  53. }

  54. void QS_Sort(char ** arr, int lo, int hi)
  55. {
  56.         if (lo < hi)
  57.         {
  58.                 int p = QS_Partition(arr, lo, hi);
  59.                 QS_Sort(arr, lo, p - 1);
  60.                 QS_Sort(arr, p + 1, hi);
  61.         }
  62. }

  63. void QSort(char ** arr, int len)
  64. {
  65.         QS_Sort(arr, 0, len - 1);
  66. }

  67. char * largestNumber(int * nums, int numsSize)
  68. {
  69.         char * strBuf = (char*)malloc(numsSize * 16);
  70.         char ** strNums = (char**)malloc(sizeof(char*) * numsSize);
  71.         int szTotalLen = 0;
  72.         for (int i = 0; i < numsSize; ++i)
  73.         {
  74.                 //char * strItem = _itoa(pNums[i], strBuf, 10);
  75.                 sprintf(strBuf, "%d", nums[i]);
  76.                 char * strItem = strBuf;

  77.                 int slen = strlen(strItem);
  78.                 szTotalLen += slen;

  79.                 strBuf += slen + 1;
  80.                 strNums[i] = strItem;
  81.         }

  82.         QSort(strNums, numsSize);

  83.         strBuf = (char*)malloc(szTotalLen + 1);
  84.         char * strRes = strBuf;
  85.         for (int i = 0; i < numsSize; ++i)
  86.         {
  87.                 char * strItem = strNums[i];
  88.                 strcpy(strBuf, strItem);
  89.                 strBuf += strlen(strItem);
  90.         }

  91.         while (*strRes == '0' && *(strRes + 1))
  92.                 ++strRes;

  93.         return strRes;
  94. }

  95. int main()
  96. {
  97.         int nums[] = { 0, 0, 1 };
  98.         char *s = largestNumber(nums, sizeof(nums) / sizeof(nums[0]));
  99.         printf("%s", s);

  100.         return 0;
  101. }
复制代码
发表于 2016-8-24 16:21:16 | 显示全部楼层
回复 13# xxpinqz


    说实话,不是很喜欢谍影重重5这种全程高能的肌肉片
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 00:33 , Processed in 0.024801 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表