后端日记 4.11 🌤 今天是等待被捞的第2周,面试流程还是没有进展。所幸有字节本月笔试给机会,抱着第一次感受氛围的心态,临阵抱佛脚刷一刷乐扣就去了。没想到试试就逝世zZ🥶
笔试概况
第一题
题目描述
战争时期,A军队经常能截获B军队发送的情报文件,这些情报文件的内容均进行了加。
为了破情报内容,A军队的情报团队经过大量研究分析,发现B军队的情报具有如下规律
1.情报中的字母仅包含大写字母,每个字母(AZ),都可能会表示另一个字母。
2.情报中的每个数字(0-9),都可能会表示另一个数字
3.情报中除了字母与数字以外的字符,不会发生变化
4.字母表顺序如下: ABCDEFGHIJKLMNOPQRSTUVWXYZ
A的顺序为1,B的顺序为2,C的顺序为3.依次类推Z的顺序为26
5.情报的破译方式与情报的第一个字符x密切相关
-若x为字母,则情报中的所有字母和数字均按照字母表顺序往后メ位。比第一个字符为B,其字母表顺序为第2位,则情报中的所有字母和数字,均要往后2位。
若x为数字,则情报中的所有字母和数字均往后位。比如第一个字符为3,则情报中的所有字母和数字,均要往后3位。
若x为其他字符,则与x为A等价。(即向后移1位)
6.如果在替换字母的过程中,向后移动x位,超过了字母,则会回到A开始计算。如字母Z向后1位,对应的字母为A。字母Z向后3位,对应的字母为C。
7.如果在替数字的过程中,向后移动x位,超过了数字9,则会回到开始计算。如数字9向后1位,对应数字0数字8向后3位,对应的数字为1
作为A军队首席情官的你,能否写一个程序,自动完成情的破译呢?
输入输出案例
sample①
input:XY.0A
output:VW.4Y
sample②
input:.4AM
output: .5BN
解题思路
看到这么长的题目,阅读困难者首先就自闭了。但是题目虽长,花时间从头到尾看一遍,总归是看懂了题,应该是考察ASCII码移位转换。题目难度一般,就是工作量很大。毕竟要考虑到各种边界值(当时写的时候因为这个心态已经崩了)
然后说一下解题思路,先对字符串Str首字符进行检索,若首字符是属于大写字母或数字,则返回ASCII,否则进入else;然后获取首字符的ASCII,进入for循环,遍历str;若当前字符属于数字则执行数字ASCII位移,若当前字符属于字母则执行字母ASCII位移,若都不属于则不做位移。
代码
package main
import (
"fmt"
)
//A-Z :ASCII VALUE 65-90
//0-9 :ASCII VALUE 48-57
func main() {
str := ""
fmt.Scan(&str)
a := ""
rdata := []rune(a)
if IsDigit(rune(str[0])) || IsLetter(rune(str[0])) {
fval := GetValue(string(str[0]))
inx := int(fval[0])
for _, item := range str {
if IsDigit(item) {
c := DigitRemove(item, inx)
rdata = append(rdata, c)
} else if IsLetter(item) {
c := LetterRemove(item, inx)
rdata = append(rdata, c)
} else {
rdata = append(rdata, item)
}
}
} else {
for _, item := range str {
c := OtherRemove(item)
rdata = append(rdata, c)
}
}
fmt.Println(string(rdata))
}
func GetValue(data string) []rune {
digit := []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}
for _, item := range digit {
if data == item {
return []rune(item)
}
}letter := []string{
"A", "B", "C", "D", "E", "F", "G", "H", "I",
"J", "K", "L", "M", "N", "O", "P", "Q",
"R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
for _, item := range letter {
if data == item {
return []rune(item)
}
}
return nil
}
func IsDigit(data rune) bool {
digit := []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}
for _, item := range digit {
if string(data) == item {
return true
}
}
return false
}
func IsLetter(data rune) bool {
letter := []string{
"A", "B", "C", "D", "E", "F", "G", "H", "I",
"J", "K", "L", "M", "N", "O", "P", "Q",
"R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
for _, item := range letter {
if string(data) == item {
return true
}
}
return false
}
func DigitRemove(data rune, dip int) rune {
if dip >= 48 && dip <= 57 {
dis := dip - 48
if data+rune(dis) > 57 {
temp := data + rune(dis) - 57
data = temp + 48
return data
} else {
data = data + rune(dis)
return data
}
}
if dip >= 65 && dip <= 90 {
dis := dip - 65 + 1
if data+rune(dis) > 57 {
temp := data + rune(dis) - 57
a := temp % 10
data = rune(a + 48 - 1)
return data
} else {
data = data + rune(dis)
return data
}
}
return data
}
func LetterRemove(data rune, dip int) rune {
if dip >= 48 && dip <= 57 {
dis := dip - 48
if data+rune(dis) > 90 {
temp := data + rune(dis) - 90
data = temp + 65
return data
} else {
data = data + rune(dis)
return data
}
}
if dip >= 65 && dip <= 90 {
dis := dip - 65 + 1
if data+rune(dis) > 90 {
temp := data + rune(dis) - 90
data = temp + 65 - 1
return data
} else {
data = data + rune(dis)
return data
}
}
return data
}
func OtherRemove(data rune) rune {
if data > 90 || data < 65 && data > 57 || data < 48 {
return data
}
if data+1 > 90 {
temp := data + 1 - 90
data = temp + 65
return data
} else if data+1 > 65 && data+1 < 90 || data+1 > 48 && data+1 < 57 {
data = data + 1
return data
} else {
temp := data + 1 - 57
data := temp + 48
return data
}
写完感觉这完全不像写算法更像在写业务了,当时慌的一p能想到的只有摁肝出来,所以了一个笨B写法。(好想知道有什么简便方法,大佬99我
今天就写这么多了,后面更新接下来的题目
先预告一下题目吧
第二题 输入两个字符串a,b
然后根据传入的两个m,n整型参数,返回合适条件的内容(字符串a前m个字符与字符串b前n个字符所组成的子串个数,去重后返回最终结果)
输入输出范例
ab ac
1 1
1