文件头
package test
import (
"fmt"
"strings"
"testing"
"unicode"
)
6 问题描述
请编写⼀个⽅法,将字符串中的空格全部替换为“%20”。 假定该字符串有⾜够的空间存放新增的字符,并且知道字符串的真实⻓度(⼩于等1000),同时保证字符串由【⼤⼩写的英⽂字⺟组成】。 给定⼀个string为原始的串,返回替换后的string。
解题思路
两个问题,第⼀个是只能是英⽂字⺟,第⼆个是替换空格。
func Test_que6(t *testing.T) {
var s string
s = "asd zxc 到处撒"
var result string
if len([]rune(s)) > 1000 {
goto FALSE
}
for _, v := range s {
if string(v) != " " && unicode.IsLetter(v) == false {
goto FALSE
}
}
result = strings.Replace(s, " ", "%20", -1)
goto TRUE
FALSE:
fmt.Println(s, false)
return
TRUE:
fmt.Println(result, true)
}
7 问题描述
有⼀个机器⼈,给⼀串指令,L左转 R右转,F前进⼀步,B后退⼀步,最后机器⼈的坐标,最开始,机器⼈位于 0 0,⽅向为正Y。 可以输⼊重复令n : ⽐如 R2(LF) 这个等于指令 RLFLF。 问最后机器⼈的坐标是多少?
解题思路
这⾥的⼀个难点是解析重复指令。主要指令解析成功,计算坐标就简单了
func Test_que7(t *testing.T) {
println(move("R2(LF)", 0, 0, 1))
}
func move (cmd string, x0 int, y0 int, z0 int) (x, y, z int) {
const (
Left = iota
Top
Right
Bottom
)
x, y, z = x0, y0, z0
repeat := 0
repeatCmd := ""
for _, s := range cmd {
switch {
case unicode.IsNumber(s):
repeat = repeat * 10 + (int(s) - '0')
case s == ')':
for i := 0 ; i < repeat; i++ {
x, y, z = move(repeatCmd, x, y, z)
}
repeat = 0
repeatCmd = ""
case repeat > 0 && s != '(' && s != ')':
repeatCmd = repeatCmd + string(s)
case s == 'L':
z = (z + 1) % 4
case s == 'R':
z = (z - 1 + 4) % 4
case s == 'F':
switch {
case z == Left || z == Right:
x = x + z - 1
case z == Top || z == Bottom:
y = y - z + 2
}
case s == 'B':
switch {
case z == Left || z == Right:
x = x - z + 1
case z == Top || z == Bottom:
y = y + z - 2
}
}
}
return
}
8
把一个整数数组的第一个元素和最后一个元素连接起来,就能形成一个环。任意截取环中长度为N的连续的一段元素,对这一段元素求和得到一个值
求截取的长度为N时,可以截取到的最大的求和值。
输入:cycle=[1,6,9,-1,2,20],N=3输出:27
func Test_que8(t *testing.T) {
var cycle = []int{1, 6, 9, -1, 2, 20}
var N = 3
l := len(cycle)
var sum int = 0
for i := 0; i < l; i++ {
num := cycle[i]
for j := 1; j < N ; j++ {
num = num + cycle[(j+i)%l]
}
if num > sum {
sum = num
}
}
fmt.Println("max: ", sum)
}
9设计一个数据结构HashMap,并实现其get操作。
func Test_que9(t *testing.T) {
const BucketCount = 128
type KV struct {
Key string
Value interface{}
}
type LinkNode struct {
Data KV
NextNode *LinkNode
}
type HashMap struct {
Buckets [BucketCount]*LinkNode
}
var HashCode = func(key string) int {
var sum = 0
for i := 0; i < len(key); i++ {
sum += int(key[i])
}
return sum % BucketCount
}
var Get = func(m *HashMap ,key string) (interface {}, bool) {
h := HashCode(key)
l := m.Buckets[h]
for l != nil {
if l.Data.Key == key {
return l.Data.Value, true
}
l = l.NextNode
}
return nil, false
}
var hm = HashMap{}
fmt.Println(Get(&hm, "123"))
}
10 已知一个无序数组array,元素均为正整数。给定一个目标值target输出数组中是否存在若干元素的组合,相加为目标值。
输入:array=[2,1,2,5,10,10,20,50] target=71输出:true
输入:array=[2,1,2,5,1010,20,50] target=101输出:false
func Test_que10(t *testing.T) {
var target = 71
var array = []int{2, 1, 2, 5, 10, 10, 20, 50, 80}
sort.Slice(array, func(i, j int) bool {
return array[i] > array[j]
})
fmt.Println(array, target)
r := test_que10(array, target)
fmt.Println(r)
}
func test_que10(array []int, target int) bool {
fmt.Println(array, target)
for i, v := range array {
fmt.Println(i,v,target)
if target < v {
continue
}
var t = target
t -= v
if t == 0{
return true
} else if t < 0 {
return false
} else {
if test_que10(array[i+1:], t) {
return true
}
}
}
return false
}