华为面试时,面试官出的一道题,将一个随机的整数转换成一个按各位上数值大小排序的整数,例如整数2541转换成1245,随机整数521368转换成123568,用C语言编程来实现,要求不能使用一步到位的库函数.
- #include <stdio.h>
- void func(char *str)
- {
- if(NULL == str)
- return ;
- unsigned int s[10] = {0};
- const char *p = str;
- while('\0' != *p)
- {
- ++ s[*p++ - '0'];
- }
- unsigned int i ,j, nCount = 0;
- for(i = 0; i < 10; ++ i)
- {
- for(j = 0; j < s[i]; ++ j)
- {
- str[ nCount++ ] = i + '0';
- }
- }
- str[nCount] = '\0';
- }
- void main()
- {
- //无论多大的数据都当作字符串处理
- char str[] = "999888877773333111100001423412412341234123412412342";
- func(str);
- printf("%s\n",str);
- }
有一段类似这样的字符串:"7C7C307C724C7C267C7C7C7C7C3A7C417C7C7" 其中每两位两位的代表一个字符,类似:“7C”对应“|”、“24”对应“$”、“41”对应“A”、“26”对应“&”等等。。。想用纯C写这样一个函数,
- #include <stdio.h>
- #include <string.h>
- #include <math.h>
- char FromStrToChar(char *str)
- {
- if(NULL == str || strlen(str) != 2)
- return '\0';
- //对应十六进制数据
- int a[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
- unsigned int i,sum = 0;
- for(i = 0; i < 2; ++ i)
- {
- if(str[i] >= '0' && str[i] <= '9')
- {
- sum += a[str[i] - '0'] * (16/pow(16,i));
- }
- else
- {
- sum += a[str[i] - 'A' + 10] * (16/pow(16,i));
- }
- }
- return (char)sum;
- }
- void StringConvert(char *str)
- {
- unsigned int len = strlen(str);
- if(len & 1)
- {
- //字符串数目为奇数,编码有问题,自动清空
- //你可以根据自己情况处理
- *str = '\0';
- return ;
- }
- unsigned int i, nCount = 0;
- char a[3] = {0};
- for(i = 0; i < len / 2; ++ i)
- {
- a[0] = str[i*2];//第一位
- a[1] = str[i*2 + 1];//第二位
- a[2] = '\0';
- str[nCount ++] = FromStrToChar(a);
- }
- str[nCount] = '\0';
- }
- void main()
- {
- char str[] = "7C7C307C724C7C267C7C7C7C7C3A7C417C7C";
- StringConvert(str);
- printf("%s\n",str);
- }