题解 | #字符串加密#
字符串加密
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;
}
查看8道真题和解析