华为面试时,面试官出的一道题,将一个随机的整数转换成一个按各位上数值大小排序的整数,例如整数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);
}