题解 | #字符串加密#
字符串加密
https://www.nowcoder.com/practice/e4af1fe682b54459b2a211df91a91cf3
#include <stdio.h> /* //肯定要建一个map //其实应该是建表用链表建立(改动next),然后再映射至数组,数组直接交换是不对的 //第一步是按照顺序提取key中出现的字符 //然后将字符从正常的字母表中删去,然后直接将这段字符串cat已删除keychar后的字母表,就可以用了 可以每找出一个keychar利用映射索引快速定位删除 */ //func返回一个map数组,之后只要根据这个map就可以通过 //提取字符串 /* 将每一个字符都遍历一遍该字符串感觉有点傻,可以利用判断字符是否仍在其原位,这样只要遍历一遍字符串(不过这样就是模块化程度降低了,耦合程度变高,传入的参数变多了) */ int compare(const void *a,const void *b) { return *(char *)a-*(char *)b; } #include <string.h> #include <stdlib.h> char *CreateMap(char *str) { int length=strlen(str); char *alphabet=(char *)malloc(26*sizeof(char)); for(int i=0;i<26;i++) { alphabet[i]='a'+i; } alphabet[26]=0; int sortpoint=0; //先交换 for(int i=0;i<length;i++) { if(str[i]==alphabet[str[i]-97]&&sortpoint<str[i]-97)//若仍呆在原位则表示可能没有被提取 //但是这么判断的话,a被其他的key字符从而被移到后面去了,这种情况也会判断为已经被提取了 //错误点3:若碰巧要交换的元素在之前已经其实交换过了,而且正好交换到了index的位置,这样还是会进来,但其实不应该进来,此时有个特点,sorpoint>str[i]-97 { //char tmp=alphabet[str[i]-97]; alphabet[str[i]-97]=alphabet[sortpoint];//错误点1:新的字符填入的位置应该是字母表筛出最新字符的后一位,而不是第i位 alphabet[sortpoint]=str[i]; sortpoint++; } //需要补充,即前面没出现相同元素也被换出去了,只可能被换到后面,若是是重复元素,则是在前面,所以利用这一点,对后面的字母表进行查找 else { char *tmpp=strchr(alphabet+sortpoint,str[i]); if(tmpp!=NULL) { //char tmp=str[i]; //tmmp *tmpp=alphabet[sortpoint];//将当前字母表i位赋值给找到的位置 alphabet[sortpoint]=str[i]; sortpoint++; } //else printf("end"); } } //对之后的元素进行排序 qsort(alphabet+sortpoint,26-sortpoint,sizeof(char),compare); return alphabet; } int main() { char str[101]="nihao";//="trailblazers"; scanf("%s",str); char *p=CreateMap(str); //得到了map //接下来就是明文转密文 char encrystr[101]="ni";//={0}; scanf("%s",encrystr); char *p2=encrystr; while(*p2!=NULL)//错误点2:指针不会null,字符串会null { printf("%c",p[*p2-97]); p2++; } return 0; }