题解 | #字符串加密#

字符串加密

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;
}

全部评论

相关推荐

10-13 17:47
门头沟学院 Java
wulala.god:图一那个善我面过,老板网上找的题库面的
点赞 评论 收藏
分享
冲芭芭拉鸭:你这图还挺新,偷了。
投递美团等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务