题解 | 字符串加解密

字符串加解密

https://www.nowcoder.com/practice/2aa32b378a024755a3f251e75cbf233a

package main

import (
	"bufio"
	"fmt"
	"os"
	"unicode"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)

	var plaintext, ciphertext string

	if scanner.Scan() {
		plaintext = scanner.Text()
	}

	if scanner.Scan() {
		ciphertext = scanner.Text()
	}

	encrypted := encrypt(plaintext)
	decrypted := decrypt(ciphertext)

	fmt.Println(encrypted)
	fmt.Println(decrypted)
}

func encrypt(s string) string {
	result := make([]rune, len(s))
	for i, char := range s {
		if unicode.IsLetter(char) {
			switch char {
			case 'Z':
				result[i] = 'a'
			case 'z':
				result[i] = 'A'
			default:
				result[i] = char + 1
				if unicode.IsUpper(char) {
					result[i] = unicode.ToLower(result[i])
				} else {
					result[i] = unicode.ToUpper(result[i])
				}
			}
		} else if unicode.IsDigit(char) {
			if char == '9' {
				result[i] = '0'
			} else {
				result[i] = char + 1
			}
		} else {
			result[i] = char
		}
	}
	return string(result)
}

func decrypt(s string) string {
	result := make([]rune, len(s))
	for i, char := range s {
		if unicode.IsLetter(char) {
			switch char {
			case 'A':
				result[i] = 'z'
			case 'a':
				result[i] = 'Z'
			default:
				result[i] = char - 1
				if unicode.IsUpper(char) {
					result[i] = unicode.ToLower(result[i])
				} else {
					result[i] = unicode.ToUpper(result[i])
				}
			}
		} else if unicode.IsDigit(char) {
			if char == '0' {
				result[i] = '9'
			} else {
				result[i] = char - 1
			}
		} else {
			result[i] = char
		}
	}
	return string(result)
}

解题思路

算法分析

这道题的核心是字符映射转换。主要涉及:

  1. 字母加密:向后移动一位并改变大小写
  2. 数字加密:加1,9变为0
  3. 解密过程:加密的逆操作
  4. 边界处理:Z→a, z→A, 9→0, 0→9

代码实现思路

  1. 字符分类处理:使用unicode.IsLetter()判断字母使用unicode.IsDigit()判断数字其他字符保持不变
  2. 字母加密逻辑:边界情况:Z→a, z→A一般情况:向后移动一位并改变大小写使用unicode.ToUpper()和unicode.ToLower()转换大小写
  3. 数字加密逻辑:边界情况:9→0一般情况:加1
  4. 解密逻辑:字母:A→z, a→Z,其他向前移动并改变大小写数字:0→9,其他减1

时间复杂度分析

  • 时间复杂度:O(n),其中n是字符串长度
  • 空间复杂度:O(n),用于存储结果字符串

关键优化点

  1. 字符分类优化:使用unicode包的标准函数
  2. 内存分配优化:预分配结果数组
  3. 边界处理优化:特殊处理Z/z和9/0的情况
  4. 大小写转换优化:使用unicode包的内置函数

边界情况处理

  1. 字母边界:Z→a, z→A, A→z, a→Z
  2. 数字边界:9→0, 0→9
  3. 非字母数字字符:保持不变
  4. 空字符串:直接返回

算法特点

  1. 对称性:加密和解密是互逆操作
  2. 循环性:字母和数字都有循环特性
  3. 大小写转换:字母在移动时同时改变大小写
  4. 简单高效:单次遍历即可完成转换

这个问题的关键在于正确处理边界情况实现对称的加密解密操作,特别是字母的大小写转换和数字的循环处理。

#实习生的蛐蛐区##牛客创作赏金赛#
全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务