返回列表 发帖

[挑战题]Largest Number

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

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

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

问题179. Largest Number
Given a list of non negative integers, arrange them such that they form the largest number.
For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330.
Note: The result may be very large, so you need to return a string instead of an integer.
Credits:
Special thanks to @ts for adding this problem and creating all test cases.
Subscribe to see which companies asked this questionCOPY
以下是本人渣翻译
给出一系列正整数,对这些数进行排列,使其拼凑出一个尽可能大(最大)的数。
例如,给出[3, 30, 34, 5, 9],则这些数所能拼凑出的最大数字是 9534330
注:给出的数组元素数量不定,结果可能非常非常大,所以你需要将结果作为字符串返回而不是int类型的整数(尤其是对于那些强类型的语言)COPY
可惜可以在该网站上传测试的语言类型有限,C/C++, java, python, ruby, js, go
[url=][/url]

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

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




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

TOP

本帖最后由 CrLf 于 2016-8-23 19:16 编辑

JavaScript 136ms:
var largestNumber = function(nums) {
return [].join.call(arguments)
.split(',')
.sort(function(a,b){
return b+a > (a+b) ? 1 : -1
})
.join('').replace(/^0+(.)/,'$1')
}COPY
不懂那些更快的是怎么实现的,好想看一看...

TOP

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

回复 3# CrLf


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

TOP

回复 4# 523066680


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

TOP

本帖最后由 pcl_test 于 2016-8-23 20:56 编辑
#*&cls&gawk -f "%~f0"&pause&exit
BEGIN{
    str="3,30,34,5,9"
    split(str,a,",");
    if(length(a)==1){
        print a[1];
    }else{
        if(str~/^[0,]*$/){
            print 0;
        }else{
            for(i=1;i<=length(a);i++){
                if(a[i]~/^0+[1-9][0-9]*$/){
                    sub(/^0+/,"",a[i]);
                }else{
                    if(a[i]~/^0+$/)sub(/0+/,"0",a[i]);
                }
                t=a[i];
                j=i-1;
                while(j>=1&&(!comp(a[j],t))){
                    a[j+1]=a[j];
                    j--;
                }
                a[j+1]=t;
            }
            for(i=1;i<=length(a);i++)s=s""a[i];
            print s;
        }
    }
}
function comp(a,b){return (a""b)*1>(b""a)*1?1:0;}COPY
1

评分人数

TOP

本帖最后由 xxpinqz 于 2016-8-24 12:57 编辑
@echo off&setlocal enabledelayedexpansion
set "s=89 89891 830 8308 8300 89899 9 999999999999999999999 9999999999999999999999999999"
for %%a in (%s%) do (
    set "a=%%a%%a%%a%%a%%a%%a%%a%%a%%a!random!"
    set #!a!=%%a
)
(for /f "tokens=2 delims==" %%a in ('set # ^|sort /r') do set/p.=%%a)<nul
pauseCOPY
变量a受最长的数值影响。。。。。。
1

评分人数

    • happy886rr: 几乎批处理不可能的,一个sort就完事了技术 + 1
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

回复 2# 523066680


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

还不下跪
1

评分人数

TOP

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

回复 7# xxpinqz


    当输入数字是 830 8308 时,显示结果为:8308
[url=][/url]

TOP

JavaScript 124ms:
var largestNumber = function(nums) {
    var arr = [];
    [].forEach.call(arguments,function(a){a.map?[].push.apply(arr,a):arr.push(a)})
return arr
    .sort(function(a,b){
    return ''+b+a > ''+a+b ? 1 : -1
    })
    .join('').replace(/^0+(.)/,'$1')
}COPY
C语言 0ms:
char* largestNumber(int* nums, int numsSize) {
struct struct_num{
int digit;
int number;
};
struct struct_num *group[10][100], *pg, *pg2;
int group_count[10]={0,0,0,0,0,0,0,0,0,0};
int i,j,k;
int number,index,digit;
char output[10000]="0";
char *p=output;
const char itoa_map[11]="0123456789";
for(i=numsSize;i--;){
number = nums[i];
for(digit=10;number>=digit;digit*=10){}
index = number/(digit/10);
pg=(struct struct_num *)malloc(sizeof(struct struct_num));
group[index][group_count[index]++]=pg;
(pg)->number = number;
(pg)->digit = digit;
}
for(i=10;i--;){
for(j=group_count[i];j-->0;){
pg = group[i][j];
for(k=j;k-->0;){
pg2 = group[i][k];
if(
((long long) pg->number * pg2->digit+pg2->number)< ((long long) pg2->number * pg->digit + pg->number)
){
* (long long*) pg ^= * (long long*) pg2;
* (long long*) pg2 ^= * (long long*) pg;
* (long long*) pg ^= * (long long*) pg2;
}
}
}
for(j=group_count[i];j--;){
pg = group[i][j];
number = pg->number;
digit = pg->digit / 10;
while(digit >= 1){
*p++ = itoa_map[number / digit % 10];
digit /= 10;
}
free(pg);
}
}
if(output[0]=='0')return "0";
*p='\0';
return output;
}COPY
2

评分人数

TOP

大家都习惯花括号不换行吗……
[url=][/url]

TOP

回复 9# 523066680

嗯,不截取就好,我干嘛去截取。谢谢!
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

回复 8# CrLf

听说谍影系列不适合看3d版。。。晃不
没影院放2d的。
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

转一个别人的代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int Comparer(char * strLeft, char * strRight)
{
char * cmpLeft = strLeft;
char * cmpRight = strRight;
for (;; ++cmpLeft, ++cmpRight)
{
char chLeft = *cmpLeft;
char chRight = *cmpRight;
if (!chLeft && !chRight)
return 0;
if (!chLeft)
{
cmpLeft = strRight;
chLeft = *cmpLeft;
}
if (!chRight)
{
cmpRight = strLeft;
chRight = *cmpRight;
}
if (chLeft == chRight)
continue;
else
return chLeft > chRight;
}
return 0;
}
void QS_Swap(char ** left, char ** right)
{
char * tmp = *left;
*left = *right;
*right = tmp;
}
int QS_Partition(char ** arr, int lo, int hi)
{
char * pivot = arr[hi];
int i = lo;
for (int j = lo; j < hi; ++j)
{
if (Comparer(arr[j], pivot))
{
QS_Swap(&arr[i], &arr[j]);
++i;
}
}
QS_Swap(&arr[i], &arr[hi]);
return i;
}
void QS_Sort(char ** arr, int lo, int hi)
{
if (lo < hi)
{
int p = QS_Partition(arr, lo, hi);
QS_Sort(arr, lo, p - 1);
QS_Sort(arr, p + 1, hi);
}
}
void QSort(char ** arr, int len)
{
QS_Sort(arr, 0, len - 1);
}
char * largestNumber(int * nums, int numsSize)
{
char * strBuf = (char*)malloc(numsSize * 16);
char ** strNums = (char**)malloc(sizeof(char*) * numsSize);
int szTotalLen = 0;
for (int i = 0; i < numsSize; ++i)
{
//char * strItem = _itoa(pNums[i], strBuf, 10);
sprintf(strBuf, "%d", nums[i]);
char * strItem = strBuf;
int slen = strlen(strItem);
szTotalLen += slen;
strBuf += slen + 1;
strNums[i] = strItem;
}
QSort(strNums, numsSize);
strBuf = (char*)malloc(szTotalLen + 1);
char * strRes = strBuf;
for (int i = 0; i < numsSize; ++i)
{
char * strItem = strNums[i];
strcpy(strBuf, strItem);
strBuf += strlen(strItem);
}
while (*strRes == '0' && *(strRes + 1))
++strRes;
return strRes;
}
int main()
{
int nums[] = { 0, 0, 1 };
char *s = largestNumber(nums, sizeof(nums) / sizeof(nums[0]));
printf("%s", s);
return 0;
}COPY
[url=][/url]

TOP

回复 13# xxpinqz


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

TOP

返回列表