微软100题(68)把数组排成最小的数
2015-06-10 09:48
232 查看
题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。
例如输入数组{32, 321},则输出这两个能排成的最小数字32132。
请给出解决问题的算法,并证明该算法。
思路:参见《剑指offer》,需要定义一种判断两个串大小的比较方式
"123""32" 和 "32""123" 前者小于后者,对应"123" < "32"
按照这种大小关系从小到到排列,连接起来的串构成的数字最小
例如输入数组{32, 321},则输出这两个能排成的最小数字32132。
请给出解决问题的算法,并证明该算法。
思路:参见《剑指offer》,需要定义一种判断两个串大小的比较方式
"123""32" 和 "32""123" 前者小于后者,对应"123" < "32"
char* g_strCombine1 = new char[256]; char* g_strCombine2 = new char[256]; int CompareString(const void* strnumber1,const void* strnumber2) { <span style="white-space:pre"> </span>strcpy(g_strCombine1,*(const char**)strnumber1); <span style="white-space:pre"> </span>strcat(g_strCombine1,*(const char**)strnumber2); <span style="white-space:pre"> </span>strcpy(g_strCombine2,*(const char**)strnumber2); <span style="white-space:pre"> </span>strcat(g_strCombine2,*(const char**)strnumber1); <span style="white-space:pre"> </span>return strcmp(g_strCombine1,g_strCombine2); }
按照这种大小关系从小到到排列,连接起来的串构成的数字最小
void PrintMinNumber(int* number,int len) { if(number==NULL || len<=0) return ; char** strnumber = (char**)(new int[len]); for (int i =0;i<len;++i) { strnumber[i] = new char[256]; sprintf(strnumber[i],"%d",number[i]); } qsort(strnumber,len,sizeof(char*),CompareString); for (int i =0;i<len;++i) cout<<strnumber[i]; cout<<endl; for (int i =0;i<len;++i) delete[] strnumber[i]; delete[] strnumber; }
相关文章推荐
- Logging with Debug And Trace (一)
- CodeIgniter使用smtp服务发送html邮件的方法
- 苹果 mac osx 下吧iOS镜像写入u盘制作系统安装盘
- p2p网络中的NAT穿透问题---NAT的原理和类型
- Linux为什么能成功?
- 12个进程管理命令介绍
- 关于document.cookie的使用方法
- 循环按钮,并且选中 (附效果图)
- Twitter 相关APP开发
- 实现真正的自动化,expect脚本语言使用
- html5常用的属性收集
- iOS学习笔记02——以编码的方式实现Auto Layout自动布局(一)
- JS 函数访问方式总结
- 关于Tcp的一些浅见
- Java基础毕向东day03
- 16款响应式布局框架
- andorid下从相册选取/拍照选取一张相片并剪切
- UESTC 490 Swap Game
- 专题-计算机网络和协议
- 五十八 后记 我在软件园的那些日子里 第一部《职场的温柔》