这是知乎上面的一个题目,挺有意思,面试的时候应该是作为基础题,很多人不屑于看这样的题目,但是到自己些的时候,就会有很多问题。

题目要求

输入一个数3256,将他从小到大输出,就是2356

分析

输入的是字符,我们这里就只分析了int类型不考虑其他字符了。

代码如下:

#include <stdio.h>
#include <string.h>

/*
二进制 |十进制 |十六进制 | 字符 
0011 0000 48 30 0
0011 0001 49 31 1
0011 0010 50 32 2
0011 0011 51 33 3
0011 0100 52 34 4
0011 0101 53 35 5
0011 0110 54 36 6
0011 0111 55 37 7
0011 1000 56 38 8
0011 1001 57 39 9
*/ 

void sort(char *nums,unsigned char *output,size_t len);
int main(int argc, char const *argv[])
{
 char nums[100];
 unsigned char output[10] = {0};/*0~9*/
 int i = 0;
 
 gets(nums);
 sort(nums,output,strlen(nums));
 //printf("\n");
 for(i = 0;i<10;i++)
 {
  while(output[i] --) printf("%c",i+0x30);
 }
 
 getchar();
 return 0;
}


void sort(char *nums,unsigned char *output,size_t len)
{
 int i = 0;
 for(i = 0;i<len;i++)
 {
  output[nums[i] - 0x30]++;
  //printf("%d,",nums[i] - 0x30);
 }
}

代码很简单,把对应的字符ascii码转成 0~9的整型,然后使用计数排序,也就是每个位置判断一下,如果这个位置是1,就把这个位置的数值加1。

输出

输入一个数3256,将他从小到大输出,就是2356_leetcode

 

输入一个数3256,将他从小到大输出,就是2356_sms_02