Hua Wei Ji Shi

华为机试 #

字符串余 #

输入若干字符串和一个数字n,按8切分字符串,长度不足补0

示例:

输入:asdf 123456789
输出:asdf0000 12345678 90000000
func splitStr(str string,n int){
    zeroStr := "00000000"
    for len(str)>8{
        fmt.Println(str[:8])
        str = str[8:]
    }
    fmt.Println(str+zeroStr[:8-len(str)])
}

货币汇率兑换算法 #

知道各货币兑换另一种货币的汇率,要求求最大兑换和最小可兑换货币

USD - RMB 1:6 RMB - HKD 1:2 HKD - JAN 1:20

示例:

输入HKD = 65
最大可兑换  USD=10,RMB=5
最小可兑换  JAN=2600

函数

// 顺序输入UDB RMB HKD 汇率,比如上面的例子,输入[6 2 20]
// moneyType = 0 1 2 3 对应 USD RMB HKD JAN,money对应货币数量
// isMax = true 时求最大可兑换 false 时求最小可兑换
// 返回兑换情况,最大[5,2,1,0],最小[0,0,0,1300]
func xxx(rate []int,moneyType int,money int,isMax bool) []int{

}

解法,代码见 货币汇率兑换算法.go

func xxx(rate []int,moneyType int,money int,isMax bool) []int{
    res := make([]int,len(rate)+1)
    res[moneyType] = money
    rate = append(rate,1)
    if isMax{
        for i:=moneyType;i>0;i--{
            res[i-1] = res[i]/rate[i-1]
            res[i] = res[i]%rate[i-1]
        }
        return res
    }
    for i:=moneyType; i < len(res)-1; i++ {
        res[i+1] = res[i] * rate[i]
        res[i] = 0
    }
    return res
}

货币汇率兑换算法2 #

知道各货币兑换另一种货币的汇率,要求求最大兑换和最小可兑换货币(注意,有可能有的货币无汇率信息)

USD - RMB 1:6 HKD - JAN 1:20

示例:

输入HKD = 65
最大可兑换  HKD=65
最小可兑换  JAN=2600

输入RMB=65
最大可兑换 USD=10,RMB=5
最小可兑换 RMB=65

函数

// 顺序输入UDB RMB HKD 汇率,比如上面的例子,输入[6 0 20],0表示不能兑换
// isMax = true 时求最大可兑换 false 时求最小可兑换
// moneyType = 0 1 2 3 对应 USD RMB HKD JAN,money对应货币数量
// 返回兑换情况,输入moneyType=2 money=65 输出最大[0,0,65,0],最小[0,0,0,1300]
// 返回兑换情况,输入moneyType=1 money=65 输出最大[10,5,0,0],最小[0,65,0,0]
func xxx(rate []int,moneyType int,money int,isMax bool) []int{


}

解法,代码见 货币汇率兑换算法2

螺旋矩阵变体 #

输入一个坐标,直接输出对应的值,比如输入横坐标-4 纵坐标6输出什么(里面是个正方形,边长乘以边长就是结果)

21 22…… 20 7 8 9 10 19 6 1 2 11 18 5 4 3 12 17 16 15 14 13

示例

输入样例 :

0 0
-1 -1
输出样例 :

1
5

先去掉内层面积,可以得到起始点值

内层面积先求内层边长,side := (max-1) * 2 + 1

内层面积:area := side*side 所以起始点为 begin := area + 1

可以根据外层最大坐标值算出起始点坐标,(max,max-1)

从起始点位置开始遍历坐标,规律为下左上右,对应 y- x- y+ x+,同时num++

当达到边角以后需要转向,需要一个计数器统计当前方向 0 1 2 3 对应 y- x- y+ x+

可以发现0 2是偶数改变y,1 3是奇数改变x,此时再确定符号

0 2平移一位变成 -1 1 可以控制y-1或者y+1,1 3平移两位变成-1 1控制x-1或者x+1

计数器数值变化需要在outSide-1的情况变化一次 所以 / (outSide-1)

计数器需要在outSide-1的时候就要变化,所以到达outSide-1时必须计数为outSide-1的倍数时 num - begin = 0 所以 num - begin + 1

func getNum(x,y int) int{
    if x == y && x == 0{
        return 1
    }
    maxNum := max(abs(x),abs(y))
    side := (maxNum - 1) * 2 + 1
    begin  := side * side + 1
    outSide := side + 2
    num := begin
    for cnt,i,j:=0,maxNum,maxNum-1;cnt<4;{
        if i == x && j == y{
            return num
        }
        if cnt%2 == 0{
            j = j + cnt - 1
        }else{
            i = i + cnt - 2
        }
        num++
        cnt = (num - begin + 1) / (outSide - 1)
    }
    return num
}

测试用例,输出1 2 3 4 5 6 7 8 9

    fmt.Println(getNum(0,0))
    fmt.Println(getNum(1,0))
    fmt.Println(getNum(1,-1))
    fmt.Println(getNum(0,-1))
    fmt.Println(getNum(-1,-1))
    fmt.Println(getNum(-1,0))
    fmt.Println(getNum(-1,1))
    fmt.Println(getNum(0,1))
    fmt.Println(getNum(1,1))


本图书由小熊©2021 版权所有,所有文章采用知识署名-非商业性使用-禁止演绎 4.0 国际进行许可。