[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[挑战题]Largest Number

本帖最后由 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

本帖最后由 523066680 于 2016-8-23 10:57 编辑

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




某群里最快的是0ms-2ms区间,C语言 (据说用语法糖越多的语言用时越多

TOP

本帖最后由 523066680 于 2016-8-23 19:02 编辑

回复 3# CrLf


    更快的当然是把那些sort函数之类的自己用更底层的语言实现啦。
好消息是我之前编译能过的代码现在不仅测试不通过而且本地编译运行崩溃,哈哈哈哈

TOP

本帖最后由 523066680 于 2016-8-24 08:42 编辑

回复 7# xxpinqz


    当输入数字是 830 8308 时,显示结果为:8308

TOP

大家都习惯花括号不换行吗……

TOP

转一个别人的代码

  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. }
复制代码

TOP

本帖最后由 523066680 于 2016-8-24 18:43 编辑

回复 17# GNU


      他们当然知道如何获取更详细的时间单位,说的是那个网站的在线测试的时间单位精度有限。
再说线下比较还可以增加测试次数和列表数据量。所以不同的结论需要结合前后文(Context)。

TOP

回复 19# happy886rr


    ? 贴了一个别人的,好像是快速排序

TOP

本帖最后由 523066680 于 2016-8-26 23:33 编辑

回复 25# xxpinqz

个人意见:
    多学几种语言,批处理之后,推荐ruby 或者 python,最好先熟悉C语言。
然后如果要自己打造应用,C# 或者 C++

刚工作那会儿有大量时间,我很后悔在批处理特效上面花太多时间,我不是说特效没卵用,而是搞图形的话应该一开始就上C/C++,可惜,当时缺少视野。
然后花了小量时间学Python,放弃后转而投入大量业余时间学Perl,这是手感上和批处理最像的。不过我觉得时间成本不太划算,C#、C++可以做更多的事。

最后,关于语言的吐槽,推荐一本书:《程序员的呐喊》

TOP

返回列表