【剑指offer】进制转换 [Go语言]

99 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

题目

描述

给定一个十进制数 M ,以及需要转换的进制数 N 。将十进制数 M 转化为 N 进制数。
当 N 大于 10 以后, 应在结果中使用大写字母表示大于 10 的一位,如 'A' 表示此位为 10 , 'B' 表示此位为 11 。
若 M 为负数,应在结果中保留负号。
数据范围:2≤N≤16
要求:空间复杂度O(M),时间复杂度 O(M)

示例1

输入:

7,2

返回值:

"111"

示例2

输入:

10,16

返回值:

"A"

备注:

M是32位整数,2<=N<=16.

AC Code

package main

/**
 * 进制转换
 * @param M int整型 给定整数
 * @param N int整型 转换到的进制
 * @return string字符串
*/
func solve( M int ,  N int ) string {
    // write code here
(1)    table := "0123456789ABCDEF"
(2)    dataByte := []byte(table)
(3)    var flag bool
(4)    if M<0{
        M = -M
        flag = true
    }
(5)    result := ""
(6)    for M > 0 {
(7)        result = string(dataByte[M%N])+result
(8)        M = M/N
    }
(9)    if M==0 && result==""{
(10)        return result+"0"
    }
(11)    if flag {
(12)        result = "-"+result
    }
    return result
}
  • (1) 指定一个table,因为题目要求是到16进制就好了,所以我们可以直接这样
  • (2) 将这个字符串转化成字节数组类型
  • (3) 定义一个flag标识是否是负数
  • (4) 如果这个数是负数,那么就让这个数先变成整数,然后再将这个flag变成正数
  • (5) 定义存储结果result
  • (6) 如果这个M>0的话就可以继续下去了
  • (7) 结果就是每一次算出这个result,对这个N进行存取,在dataByte中找到这个对应的值。
  • (8) 这个M等于这个M/对应转换的进制数
  • (9) 如果这个M=0的话
  • (10) 就返回0
  • (11) 如果这个flag是true,就表示这个数是负数的话
  • (12) 加上这个负号即可!