华为机试题—把数组排成最小的数 c++
2016-06-02 22:41
330 查看
题目描述:
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
输入:
输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为一个整数m (1<=m <=100)代表输入的正整数的个数。
输入的第二行包括m个正整数,其中每个正整数不超过10000000。
输出:
对应每个测试案例,
输出m个数字能排成的最小数字。
样例输入:
3
23 13 6
2
23456 56
样例输出:
13236
2345656
注:markdownpad2中,一行文字需要换行,只需要在行末尾加上两个空格即可。
解析 :按照整数形式,将若干个数字连接起来很麻烦,所以我们可以将整数转化为字符串,这样连接起来我们可以使用库函数。然后将字符串数组进行排序。 这里注意的是字符串的比较函数需要重新定义,不是比较a和b,而是比较ab与 ba。如果ab < ba,则a < b;如果ab > ba,则a > b;如果ab = ba,则a = b。比较函数的定义是本解决方案的关键。这道题其实就是希望我们能找到一个排序规则,根据这个规则排出来的数组能排成一个最小的数字。
源码
注:markdownpad2中加入代码块可以在代码块前后加
或者Tab键 空四格
题目延伸:
1.
参数:
1 待排序数组首地址
2 数组中待排序元素数量
3 各元素的占用空间大小
4 指向函数的指针,用于确定排序的顺序
举例:
对一个长为1000的数组进行排序时,int a[1000]; 那么base应为a,num应为 1000,width应为 sizeof(int),comp函数随自己的命名。
2.
itoa()功能:将任意类型的数字转换为字符串。在
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
输入:
输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为一个整数m (1<=m <=100)代表输入的正整数的个数。
输入的第二行包括m个正整数,其中每个正整数不超过10000000。
输出:
对应每个测试案例,
输出m个数字能排成的最小数字。
样例输入:
3
23 13 6
2
23456 56
样例输出:
13236
2345656
注:markdownpad2中,一行文字需要换行,只需要在行末尾加上两个空格即可。
解析 :按照整数形式,将若干个数字连接起来很麻烦,所以我们可以将整数转化为字符串,这样连接起来我们可以使用库函数。然后将字符串数组进行排序。 这里注意的是字符串的比较函数需要重新定义,不是比较a和b,而是比较ab与 ba。如果ab < ba,则a < b;如果ab > ba,则a > b;如果ab = ba,则a = b。比较函数的定义是本解决方案的关键。这道题其实就是希望我们能找到一个排序规则,根据这个规则排出来的数组能排成一个最小的数字。
源码
#include <iostream> #include <math.h> #include <assert.h> using namespace std; const int len =10; char strs[100][len]; char comstr1[2*len]; char comstr2[2*len]; int mycompare(const void *str1,const void *str2) { strcpy(comstr1,(char*)str1); strcat(comstr1,(char*)str2); strcpy(comstr2,(char*)str2); strcat(comstr2,(char*)str1); return strcmp(comstr1,comstr2); void printfminnum(int *nums,int num) { assert(nums); int i; for(i=0;i<num;i++) itoa(nums[i],strs[i],10); //sprintf(strs[i],"%d",nums[i]); 将nums[i]转化成10进制表示的字符串 qsort(strs,num,10*sizeof(char),mycompare); for(i=0;i<num;i++) printf("%s",strs[i]); printf("\n"); } int main() { int nums[100]; int m;//数组元素个数 cin>>m; for(int i=0;i<m;i++) cin>>nums[i]; printfminnum(nums,m); }
注:markdownpad2中加入代码块可以在代码块前后加
“```”
或者Tab键 空四格
题目延伸:
1.
void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
参数:
1 待排序数组首地址
2 数组中待排序元素数量
3 各元素的占用空间大小
4 指向函数的指针,用于确定排序的顺序
举例:
对一个长为1000的数组进行排序时,int a[1000]; 那么base应为a,num应为 1000,width应为 sizeof(int),comp函数随自己的命名。
qsort(a,1000,sizeof(int),comp); int comp(const void*a,const void*b) { return *(int*)a-*(int*)b; }
2.
itoa()功能:将任意类型的数字转换为字符串。在
<stdlib.h>中与之有相反功能的函数是atoi。itoa()不是C标准库中的函数,而是Windows平台下扩展的,标准库中有sprintf(),功能比这个更强,用法跟printf()类似,以后专门学习:
char str[255]; sprintf(str, "%x", 100); //将100转为16进制表示的字符串。
相关文章推荐
- C语言中qsort函数用法实例小结
- sort()函数与qsort()函数及其头文件
- 使用qsort对二维数组李的某一列元素进行排序
- qsort的简单实现源码
- 关于cmp函数返回值的一点小解释
- qsort范例学习
- qsort函数用法
- stl排序函数用户自定义比较函数扩展
- 结构体简单排序-一级-二级
- qsort与sort的使用方法(比较函数详析)
- poj1007 qsort快排
- 结构体快排qsort()
- uva10132 字符串数组的qsort排序技巧
- qsort对多维数组和结构体的排序
- 库函数qsort的实现
- UVA 123 Searching Quickly
- 七种qsort排序方法
- qsort各种类型代码(例子)
- 基于单链表的快速排序
- 深入分析qsort库函数