把数组排成最小的数34
2016-06-18 17:26
316 查看
题目描述:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3, 32, 321},则打印出这3个数字能排成的最小数字321323。
解题思路:
考虑两个数拼接可能会溢出,使用字符串解决大数问题。
测试用例:
函数实现:
解题思路:
考虑两个数拼接可能会溢出,使用字符串解决大数问题。
测试用例:
int main(){ //输入数组 int arr[3] = {3, 32, 321}; //数组中的数字组合排列中最小的数字 PrintMinNumber(arr, 3); //Output:321323 return 0; }
函数实现:
const int g_MaxNumberLength = 10; char *g_StrCombine1 = new char[g_MaxNumberLength * 2 + 1]; char *g_StrCombine2 = new char[g_MaxNumberLength * 2 + 1]; //辅助函数,自定义比较大小. 即比较mn大还是nm大 int compare(const void *strNumber1, const void *strNumber2){ strcpy(g_StrCombine1, *(const char**) strNumber1); //复制 strcat(g_StrCombine1, *(const char**) strNumber2); //追加 strcpy(g_StrCombine2, *(const char**) strNumber2); //复制 strcat(g_StrCombine2, *(const char**) strNumber1); //追加 return strcmp(g_StrCombine1, g_StrCombine2); //返回比较结果 } //主函数实现 void PrintMinNumber(int *numbers, int length){ if(numbers == NULL || length <= 0) return; char **strNumbers = (char**)(new int[length]); for(int i = 0; i < length; ++i){ strNumbers[i] = new char[g_MaxNumberLength + 1]; sprintf(strNumbers[i], "%d", numbers[i]); } qsort(strNumbers, length, sizeof(char*), compare); for(int i = 0; i < length; ++i) printf("%s", strNumbers[i]); std::cout << std::endl; for(int i = 0; i < length; ++i) delete []strNumbers[i]; delete[] strNumbers; }
相关文章推荐
- 丑数35
- Latin输入法如何添加删除某些语言的输入法
- hdu 5411 CRB and Puzzle【矩阵快速幂】
- Redis 相关学习
- 个人总结
- sql server 带输入输出参数的分页存储过程(效率最高)
- CCD CMOS传感器基本工作原理
- PHP中级程序员常见面试题
- Java远程调试
- Ubuntu 上搭建 Samba 服务器
- 【命令cp】linux cp复制命令参数及用法详解
- bzoj 1513: [POI2006]Tet-Tetris 3D(二维线段树+标记永久化)
- 个人学习笔记---inode节点详解
- 下载B(bilibili)站视频
- [翻译] Linux and the Device Tree
- 获取NVIDIA显卡的温度
- 获取NVIDIA显卡的温度
- @Inject和@Autowired以及@Resource区别
- 获取NVIDIA显卡的温度
- yum源配置方式