H面试程序(7):去掉字符串中重复的数
之前的答案只能把字符串中不同的数字字符显示出来,现在这个可以把重复的字符从字符串中去掉
#include<stdio.h>#include<assert.h>#include<memory.h>#include<stdlib.h>//50minvoid RemoveAllDuplicates(char seq[ ], int n){ assert(seq);int * phash = (int *)malloc( 10*sizeof(int) ); //因为如果是字符串里面的数字 为0~9,只需要映射10个数字到hash的空间存放就行了memset(phash,0,10*sizeof(int));int j = 0;for(int i = 0; i <n-1; i++ ){ if( phash[seq[i] -'0'] == 0) //若相应位的hash位置为0,说明未出现过 seq[i] -'0':字符到数字的转化{phash[seq[i]-'0'] = 1;if(i!=j) //正常情况下,i!=j的情况下就是说明中间有一些数是重复的seq[j] = seq[i];j++; // j++后表示里面存放的是下一个没有出现过的数字}else //若相应位的hash位置为1,说明出现过,i继续向后面扫描,j留在原地等待存放下一个没有出现过的数字{ continue;} }seq[j] = '\0'; //最后一个结束符 }int main(){ //char seq[] = { '5','3','3','8','5','6','8','\0'}; char seq[100]; //输入数字字符串gets(seq); RemoveAllDuplicates(seq, sizeof(seq)/sizeof(char)); //源代码直接写的8,这样写比较好 printf("%s", seq); return 0; }
之前的答案:
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<assert.h>void RemoveAllDuplicates(int seq[], int n) { int *pHash = (int*)malloc(sizeof(int)*n);assert(pHash); //判断申请空间是否成功 memset(pHash,0,sizeof(pHash)*n); //将申请的空间进行初始化 int i; for(i = 0;i < n;++i) { pHash[seq[i]]++; //数组中的数出现一次就在pHash中对应位置加1 if(1 == pHash[seq[i]] ) //若在pHash中只出现一次,则输出,否则跳过,检查下一个数 { printf("%d/t",seq[i]); } } free(pHash); } int main() { int seq[] = { 5,3,4,2,3,2,2,5}; RemoveAllDuplicates(seq, sizeof(seq)/sizeof(int)); //源代码直接写的8,这样写比较好 return 0; }