華為面試時,面試官出的一道題,將一個隨機的整數轉換成一個按各位上數值大小排序的整數,例如整數2541轉換成1245,隨機整數521368轉換成123568,用C語言編程來實現,要求不能使用一步到位的庫函數.
[cpp]
view plaincopy
- #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寫這樣一個函數,
[cpp]
view plaincopy
- #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);
-
- }