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.
C语言版本:
int getSize(int num) { int n = 0; if (num == 0) return 1; while (num) { n++; num /= 10; } return n; } char *itoa(int num) { int size = getSize(num); char *result = malloc(sizeof(char) * ( size + 1)); result[size] = 0; while(size) { result[size - 1] = num % 10 + ‘0‘; size--; num /= 10; } return result; } int numCmp(int left, int right) { int left_size = getSize(left); int right_size = getSize(right); int result = 0; char *left_c = NULL, *right_c = NULL; char *left_tmp = itoa(left); char *right_tmp = itoa(right); left_c = malloc(sizeof(char) *(left_size + right_size + 1)); right_c = malloc(sizeof(char) *(left_size + right_size + 1)); strcpy(left_c, left_tmp); strcpy(right_c, right_tmp); strcat(left_c, right_tmp); strcat(right_c, left_tmp); result = strcmp(left_c, right_c); free(left_tmp); free(right_tmp); free(left_c); free(right_c); return result; } char* largestNumber(int* nums, int numsSize) { int i = 0; int max = 0; int left = 0, right = 0; int n = 0; char *result = NULL; if (numsSize == 0) return NULL; for (; i < numsSize; i++) { max = nums[i]; for (int j = i + 1; j < numsSize; j++) { if (numCmp(nums[j], nums[i]) > 0) { nums[i] = nums[j]; nums[j] = max; max = nums[i]; } } n += getSize(max); } result = (char *)malloc(sizeof(char)* (n + 1)); result[n] = 0; i = 0; for (int j = 0; j < numsSize; j++) { int index = 0; max = nums[j]; index = getSize(max); n = index; if (max == 0) result[i] = ‘0‘; else{ while (index) { result[index + i - 1] = max % 10 + ‘0‘; max /= 10; index--; } } i += n; } if(result[0] == ‘0‘) return "0"; //当为“000000”都为0时,则只输出一个“0”; return result; }
原文:http://www.cnblogs.com/dylqt/p/5014159.html