[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 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. }
复制代码
不懂那些更快的是怎么实现的,好想看一看...

TOP

回复 4# 523066680


    JavaScript 组有人是 120ms,比我快多了,实在想不出来他把时间省在哪里了
    回头我也用c玩一个

TOP

回复 2# 523066680


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

还不下跪
1

评分人数

TOP

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

评分人数

TOP

回复 13# xxpinqz


    说实话,不是很喜欢谍影重重5这种全程高能的肌肉片

TOP

好像还可以继续优化,可惜没有微秒和纳秒,比较不出来

TOP

本帖最后由 CrLf 于 2016-8-25 00:29 编辑

回复 19# happy886rr


    感觉排序方式不是最重要的,个人经验,结构优化的收益远比冒泡和快速排序之间的效率差异大得多:
  1. 1、用结构体 struct_num 保存数字和进位,排序时用 (long long) 数值比较大小,等到输出时再转为字符串
  2. 2、分设 10 个数组 hash 表,用于保存由 0-9 开头的数字组成的数组,这样只需要对 1-9 各组单独排序即可
  3. 3、函数自实现/内联,就题解题,节省函数调用开销
复制代码

TOP

回复 24# aa77dd@163.com


    要看稳定值,我看到120毫秒那个档很集中,绝不是偶然,一定有什么我还没想到的办法

TOP

本帖最后由 CrLf 于 2016-11-16 01:36 编辑

JS 修改后耗时约为 109ms
  1. var largestNumber = function(nums) {
  2.     return nums
  3.         .sort((a,b) => ''+b+a > ''+a+b ? 1 : -1)
  4.         .join('')
  5.         .replace(/^0+(?=.)/,'')
  6. }
复制代码
尽量用 ES6 的语法来写的版本看起来也很萌...
  1. var largestNumber = function(nums) {
  2.     let arr = [];
  3.     for(let a of nums)arr.unshift(`${a}`)
  4.     let retArr = arr.sort((a,b) => b+a > a+b ? 1 : -1)
  5.     return retArr[0]==='0' ? '0' : retArr.join('')
  6. }
复制代码
1

评分人数

TOP

返回列表