字节跳动后端研发四月份笔试(1)|GO主题月

786 阅读5分钟

后端日记 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