题解 第三章排序与查找| #找位置#
找位置
http://www.nowcoder.com/practice/e3b2cc44aa9b4851bdca89dd79c53150
法1:
使用了哈希表
参考这一篇文章:https://blog.nowcoder.net/n/9bdf2f93480045b6810453b39196260b
哈希表不一定要是链表形式,也可能是用一个数组结构存放
#include <stdio.h>
//ASCII码一共128位
//0-9是48-57
//A-Z是65-90
//a-z是97-122
typedef struct CharTable
{
int Num;
int Place[15];
}CharTable;
//哈希表的结构,其中Place中装入有各个字符的位置
//哈希表也不一定要用链表的形式
//比如此处Table中的每一块内
//只用存放该字母首次出现的位置
int main()
{
CharTable myCharTable[128];
//定义了这样一个哈希表后,需要将其清零
//使用memset函数
//void *memset(void* s,int ch,size);
//memset(myCharTable,0,128*sizeof(CharTable));
memset(myCharTable,0,sizeof(myCharTable));
//使用sizeof可以返回该数组的内存占有长度
//将现有数据输入
char C;
int order=0,tmp;
while(scanf("%c",&C)!=EOF)
{
tmp=myCharTable[C].Num++;
myCharTable[C].Place[tmp]=order;
order++;
}
//得到输出的顺序,得到有几个数字
char Rank[order];
memset(Rank,0,sizeof(Rank));
for(int i=0;i<128;i++)
{
if(myCharTable[i].Num!=0)
Rank[myCharTable[i].Place[0]]=(char)i;
}//在Rank中存入了每一个字符的出现先后次序
//有的多余的地方是存了0,这些都是要舍去的
//按顺序,将hash表中的所有的结果输出
int presChar;
for(int i=0;i<sizeof(Rank);i++)
{
presChar=Rank[i];
if(myCharTable[presChar].Num>1)
{
for(int j=0;j<myCharTable[presChar].Num-1;j++)
{
printf("%c:%d,",(char)presChar,myCharTable[presChar].Place[j]);
}
printf("%c:%d\n",(char)presChar,myCharTable[presChar].Place[myCharTable[presChar].Num-1]);
//这里是防止最后多打了一个逗号
}
}
return 0;
}
王道机试指南刷题 文章被收录于专栏
计划刷完这本书