[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
C
  1. void q_sort(char* arr[], const int len) {
  2.     typedef struct _Range {
  3.         int start, end;
  4.     } Range;
  5.     Range new_Range(int s, int e) {
  6.         Range r;
  7.         r.start = s;
  8.         r.end = e;
  9.         return r;
  10.     }
  11.     if (len <= 0)
  12.         return;
  13.     Range r[len];
  14.     int p = 0;
  15.     r[p++] = new_Range(0, len - 1);
  16.     while (p) {
  17.         Range range = r[--p];
  18.         if (range.start >= range.end)
  19.             continue;
  20.         char* mid = arr[range.end], * cp;
  21.         int left = range.start, right = range.end - 1;
  22.         while (left < right) {
  23.             while (GTR(mid, arr[left]) && left < right)
  24.                 left++;
  25.             while (!GTR(mid, arr[right]) && left < right)
  26.                 right--;
  27.             cp = arr[left], arr[left] = arr[right], arr[right] = cp;
  28.         }
  29.         if (!GTR(mid, arr[left]))
  30.             cp = arr[left], arr[left] = arr[range.end], arr[range.end] = cp;
  31.         else
  32.             left++;
  33.         r[p++] = new_Range(range.start, left - 1);
  34.         r[p++] = new_Range(left + 1, range.end);
  35.     }
  36. }
  37. int GTR(char* s1, char* s2) {
  38.     char * p1 = s1, * p2 = s2;
  39.     while (1) {
  40.         if (!*p1 && !*p2) return 1;
  41.         if (!*p1) p1 = s2;
  42.         if (!*p2) p2 = s1;
  43.         if (*p1 > *p2)
  44.             return 1;
  45.         else if (*p1 < *p2)
  46.             return 0;
  47.         else p1++, p2++;
  48.     }
  49. }
  50. char* largestNumber(int* nums, int numsSize) {
  51.     char strs [numsSize][11], * strPtrs[numsSize], * cp1, * cp2, * strRet = malloc(10 * numsSize + 1), ch;
  52.     int i, j, k, t;
  53.     for (i = 0; i < numsSize; i++) {
  54.         t = *(nums + i);
  55.         j = 0;
  56.         k = -1;
  57.         // digits convert to string
  58.         do {
  59.             strs[i][j++] = '0' + t % 10;
  60.         } while ((t /= 10) > 0);
  61.         strs[i][j] = '\0';
  62.         // reverse string
  63.         *(strPtrs + i) = cp1 = *(strs + i);
  64.         while (--j > ++k)
  65.             * (cp1 + j) ^= *(cp1 + k), * (cp1 + k) ^= *(cp1 + j), * (cp1 + j) ^= *(cp1 + k);
  66.     }
  67.     q_sort(strPtrs, numsSize);
  68.     // printf("After q_sort\n");
  69.     // for (i = numsSize - 1; i >= 0; i--) printf("%s\n", strPtrs[i]);
  70.     cp2 = strRet;
  71.     if (strPtrs[numsSize - 1][0] == '0') {
  72.         *strRet = '0';
  73.         *(strRet + 1) = '\0';
  74.         return strRet;
  75.     }
  76.     for (i = numsSize - 1; i >= 0; i--) {
  77.         cp1 = *(strPtrs + i);
  78.         while (ch = *(cp1++)) *(cp2++) = ch;
  79.     }
  80.     *cp2 = '\0';
  81.     return strRet;
  82. }
复制代码
1

评分人数

    • 523066680: 你们的花括号都不换行吗……PB + 12

TOP

回复 22# CrLf

没仔细看你的代码, 估计用到了这种方式

比较 830 和 8308

预处理时, 计算出了大于 各数位数 的最小的 10 的幂
830(1000), 8308(10000)

比较时:
互相乘以对方的特征幂 再加上对方, 得到等位数拼接串:

830 * 10000 + 8308 <--> 8308 * 1000 + 830

最后得到比较结果
为防止 int 类型溢出, 必须用超出 int 范围的类型处理

字符数组指针方式比较仍然烦琐
2

评分人数

TOP

本帖最后由 aa77dd@163.com 于 2016-8-26 20:40 编辑

回复 3# CrLf

多测试几次就能做到, 我用同一个代码提交了多次

最慢时 184ms, 最快时 116ms

在 my submissions 里记录了每一次提交测试的结果
  1. /**
  2. * @param {number[]} nums
  3. * @return {string}
  4. */
  5. var largestNumber = function(nums) {
  6.    
  7. nums = nums.map(function(num) {
  8.   return '' + num;
  9. });
  10.    
  11.     var rs=[],re=[],p=0;
  12.     rs[p] = 0;
  13.     re[p++]= nums.length-1;
  14.     var ss,ee,t;
  15.     while (p) {
  16.         ss = rs[--p];
  17.         ee = re[p];
  18.         if (ss >= ee)
  19.             continue;
  20.         var mid = nums[ee];
  21.         var left = ss, right = ee - 1;
  22.         while (left < right) {
  23.             while (nums[left] + mid > mid + nums[left] && left < right)
  24.                 left++;
  25.             while (mid + nums[right] >= nums[right] + mid && left < right)
  26.                 right--;
  27.             t = nums[left];
  28.             nums[left] = nums[right];
  29.             nums[right] = t;
  30.         }
  31.         if (mid + nums[left] >= nums[left] + mid) {
  32.             t = nums[left];
  33.             nums[left] = nums[ee];
  34.             nums[ee] = t;
  35.         } else
  36.             left++;
  37.         rs[p] = ss;
  38.         re[p++] = left - 1;
  39.         rs[p] = left + 1;
  40.         re[p++] = ee;
  41.     }
  42.     if (nums[0] == 0) return '0';
  43.     return nums.join('');
  44. };
复制代码
1

评分人数

    • 523066680: 没错,可能和服务器占用有关PB + 6

TOP

返回列表