提示:文章
文章目录
- 前言
- 一、背景
- 二、
- 2.1
- 2.2
- 总结
前言
前期疑问:
本文目标:
一、背景
最近
二、
2.1 HJ36字符串加密
解题
#include <stdio.h>
#include <stdbool.h>int GetStrIndex(char c, char* dict, int len)
{int index = 0;for(int i = 0; i < len; i++){if(c == dict[i]){index = i;}break;}return index;
}int main() {int a, b;char strKey[101];char str[101];while (fgets(strKey, 101, stdin) != NULL) { // 注意 while 处理多个 case// 64 位输出请用 printf("%lld") to fgets(str, 101, stdin);int lengthStrKey = strlen(strKey);strKey[lengthStrKey - 1] = '\0';int lengthStr = strlen(str);str[lengthStr - 1] = '\0';char dictionary[26] = {'\n'};int dictionaryIndex = strlen(strKey);for(int i = 0; i < strlen(strKey); i++){dictionary[i] = strKey[i];} for(int i = 0; i < 26 - strlen(strKey); i++){char c = i + 'a';bool flag = false;for(int j = 0; j < strlen(strKey); j++){if(c == strKey[j]){flag = true;break;}}if(!flag){dictionary[dictionaryIndex++] = c;}}for(int i = 0; i < lengthStr; i++){int index = str[i] - 'a';str[i] = dictionary[index];}printf("%s", str);}return 0;
}//gets会将'\0'改成'\n',strlen需要有\0结尾,strlen不算\0这个字符
未通过示例
用例输入
bvsrduec
bmrkgqybpcpmmntmckxak
预期输出
vingemyvlsliijpisgxbg
实际输出
vingem
下述代码解决上述异常问题,并且增加了对key字符串的去重处理
#include <stdio.h>
#include <stdbool.h>int GetStrIndex(char c, char* dict, int len)
{int index = 0;for(int i = 0; i < len; i++){if(c == dict[i]){index = i;}break;}return index;
}char* SimplifyStrKey(char* strKey, int len)
{int key[26] = {0};char retKey[26] = {'\0'};char* ret = (char*)malloc(sizeof(char) * len);memset(ret, '0', sizeof(char) * len);int retKeyIndex = 0;for(int i = 0; i < len; i++){if(key[strKey[i] - 'a'] == 0){ret[retKeyIndex++] = strKey[i];key[strKey[i] - 'a']++;}}return ret;
}int main() {int a, b;char strKey[101];char str[101];while (fgets(strKey, 101, stdin) != NULL) { // 注意 while 处理多个 case// 64 位输出请用 printf("%lld") to fgets(str, 101, stdin);int lengthStrKey = strlen(strKey);strKey[lengthStrKey - 1] = '\0';int lengthStr = strlen(str);str[lengthStr - 1] = '\0';char dictionary[26] = {'\0'};int dictionaryIndex = strlen(strKey);char* modifyKeyStr = SimplifyStrKey(strKey, lengthStrKey);//printf("%s\n",modifyKeyStr);for(int i = 0; i < strlen(modifyKeyStr); i++){dictionary[i] = modifyKeyStr[i];} for(int i = 0; i < 26 && dictionary[25] == '\0'; i++){char c = i + 'a';bool flag = false;for(int j = 0; j < strlen(modifyKeyStr); j++){if(c == modifyKeyStr[j]){flag = true;break;}}if(!flag){dictionary[dictionaryIndex++] = c;}}for(int i = 0; i < lengthStr; i++){int index = str[i] - 'a';str[i] = dictionary[index];}printf("%s", str);free(modifyKeyStr);}return 0;
}
但是现在下面的示例还是没有通过
用例输入
ybkgenngvjrajenzeqhmamrptohmdmxfmxngjg
zu预期输出
wc
实际输出
空
分析原因是因为计算keyStr的长度时,应该在keyStr被去重后计算,修改后就通过全部示例
#include <stdio.h>
#include <stdbool.h>int GetStrIndex(char c, char* dict, int len)
{int index = 0;for(int i = 0; i < len; i++){if(c == dict[i]){index = i;}break;}return index;
}char* SimplifyStrKey(char* strKey, int len)
{int key[26] = {0};char retKey[26] = {'\0'};char* ret = (char*)malloc(sizeof(char) * len);memset(ret, '0', sizeof(char) * len);int retKeyIndex = 0;for(int i = 0; i < len; i++){if(key[strKey[i] - 'a'] == 0){ret[retKeyIndex++] = strKey[i];key[strKey[i] - 'a']++;}}return ret;
}int main() {int a, b;char strKey[101];char str[101];while (fgets(strKey, 101, stdin) != NULL) { // 注意 while 处理多个 case// 64 位输出请用 printf("%lld") to fgets(str, 101, stdin);int lengthStrKey = strlen(strKey);strKey[lengthStrKey - 1] = '\0';int lengthStr = strlen(str);str[lengthStr - 1] = '\0';char dictionary[26] = {'\0'};char* modifyKeyStr = SimplifyStrKey(strKey, lengthStrKey);int dictionaryIndex = strlen(modifyKeyStr);//printf("%s\n",modifyKeyStr);for(int i = 0; i < strlen(modifyKeyStr); i++){dictionary[i] = modifyKeyStr[i];} for(int i = 0; i < 26 && dictionary[25] == '\0'; i++){char c = i + 'a';bool flag = false;for(int j = 0; j < strlen(modifyKeyStr); j++){if(c == modifyKeyStr[j]){flag = true;break;}}if(!flag){dictionary[dictionaryIndex++] = c;}}for(int i = 0; i < lengthStr; i++){int index = str[i] - 'a';str[i] = dictionary[index];}printf("%s", str);free(modifyKeyStr);}return 0;
}//gets会将'\0'改成'\n',strlen需要有\0结尾,strlen不算\0这个字符
三、
3.1
总结
未完待续