题解 | #字符串加解密#
字符串加解密
https://www.nowcoder.com/practice/2aa32b378a024755a3f251e75cbf233a
// 字符串加解密
#include <stdio.h>
#include <stdlib.h>
char EncryChar(char chr) {
if (chr >= 'A' && chr <= 'Z') {
if (chr == 'Z') return 'a';
else return chr + 32 + 1;
}
if (chr >= 'a' && chr <= 'z') {
if (chr == 'z') return 'A';
else return chr - 32 + 1;
}
if (chr <= '9' && chr >= '0') {
if (chr == '9') return '0';
else return chr + 1;
}
return 0;
}
/*
解密方法为加密的逆过程。
//好吧,感觉可以建表,因为给定了只出现大小写字母和数字
//思路如下:建立一个map[26大写+26小写+10]
mapfunc要实现输入字符和加密/解密命令参数,返回对应的值
例如,我要加密a,mapfun('a',1),直接找到map[26].enval
如果要解密a,mapfun('a',1),直接找到map[26].deval
//这需要有一张表,先对应A-Za-Z0-9与index的关系
//还得要有个函数,能快速返回index
*/
int Index(char cur) {
if (cur >= 'A' && cur <= 'Z') return (int)cur - 65;
if (cur >= 'a' && cur <= 'z') return (int)cur - 97 + 26;
if (cur >= '0' && cur <= '9') return (int)cur - (int)'0' + 26 + 26;
return -1;
}
//输入index,返回对应的原字符,方便建表的时候数组引用
char Indexforchar(int index) {
if (index >= 0) {
if (index < 26) return index + 65;
if (index < 26 + 26) return index + 97 -
26; //错误点1:没有考虑传进来的index初始值要-26
if (index < 26 + 26 + 10) return index + 48 - 26 - 26;
}
return 0;
}
typedef struct {
/* data */
char enval;
char deval;
} mapPoint;
//map结构体生成函数
mapPoint* InitMapPoint(int index) {
char chr = Indexforchar(index);
mapPoint* newPoint = (mapPoint*)malloc(sizeof(mapPoint));
newPoint->enval = EncryChar(chr);
newPoint->deval = 0;
return newPoint;
}
//补全map的deval
void CompleteMap(mapPoint** mapPoint, int size) {
for (int i = 0; i < size; i++) {
int newindex = Index(mapPoint[i]->enval);
mapPoint[newindex]->deval = Indexforchar(i);
}
}
char mapfunc(char cur, int enOrde, mapPoint** mp) {
if (enOrde == 1)
return mp[Index(cur)]->enval;
else if (enOrde == 0)
return mp[Index(cur)]->deval;
return 0;
}
int main() {
int size = 26 + 26 + 10;
mapPoint** mappoint = (mapPoint**)malloc(size * sizeof(
mapPoint*)); //错误点2:malloc(size*sizeof(map))只有62个map结构体(sizeof(map)=2)大小,而不是指针62*8的大小
for (int i = 0; i < size; i++) {
mappoint[i] = InitMapPoint(i);
//if(mapPoint[i]->enval=='a')
//printf("%c ",mapPoint[i]->enval);
}
CompleteMap(mappoint, size);
// for(int i=0;i<size;i++)
// {
// printf("%c %c %c\n",Indexforchar(i),mapPoint[i]->enval,mapPoint[i]->deval);
// }
//至此Map建立完成
char str[1001];
int i = 0;
gets(str);
while (i < 1001) {
if (str[i] == '\n' || str[i] == 0) break;
str[i] = mapfunc(str[i], 1, mappoint);
printf("%c", str[i]);
i++;
}
printf("\n");
i = 0;
gets(str);
while (i < 1001) {
if (str[i] == '\n' || str[i] == 0) break;
str[i] = mapfunc(str[i], 0, mappoint);
printf("%c", str[i]);
i++;
}
//printf("%d",'0');
return 0;
}
查看3道真题和解析