Leetcode-数字操作

文章目录

    • q7整数反转
    • q8 字符串转换整数
    • q9 回文数
    • q43 字符串相乘
    • q172 阶乘后的零
    • q258 各位相加
    • q461 汉明距离
    • 剑指 Offer 15. 二进制中1的个数
    • 剑指 Offer 16. 数值的整数次方
    • 剑指 Offer 17. 打印从1到最大的n位数


q7整数反转


题目传送门


题解

水题。

func reverse(x int) int {
	num := 0
	for x != 0 {
		num = num * 10 + x % 10
		x /= 10
		if num < -math.MaxInt32 || num > math.MaxInt32 {
			return 0
		}
	}
	return num
}

q8 字符串转换整数


题目传送门


题解

跟着题目的要求一步一步来即可,首先通过增加下标清除前导空格。然后判断正负号,判断正负号的时候要注意,得使用else if,不然当字符串前面连续出现-和+号时会出现问题,后面累加数字+判断是否超出区间即可。

func myAtoi(s string) int {
	i, num, isNeg := 0, 0, 1
	// 去掉多余的空格
	for i < len(s) && s[i] == ' ' {
		i++
	}
	// 判断正负
	if i < len(s) {
		if s[i] == '-' {
			isNeg = -1
			i++
		} else if s[i] == '+' {
			i++
		}
		// 如果两个条件都不满足,可以过滤没用的字符
	}

	// 开始遍历数字
	for i < len(s) && s[i] >= '0' && s[i] <= '9' {
		num = num*10 + int(s[i]-'0')
		// 判断是否出界
		if num*isNeg < math.MinInt32 {
			return math.MinInt32
		}
		if num*isNeg > math.MaxInt32 {
			return math.MaxInt32
		}
		i++
	}
	return num * isNeg
}

q9 回文数


题目传送门


题解

反转数字,如果与原数字相等,就是回文数。

func isPalindrome(x int) bool {
	if x < 0 {
		return false
	}
	num := 0
	tmp := x
	for tmp != 0 {
		num = num * 10 + tmp % 10
		tmp /= 10
	}
	return num == x
}

q43 字符串相乘


传送门


题解

高精度乘法。

func multiply(num1 string, num2 string) string {
	a := make([]int, 111)
	b := make([]int, 111)
	c := make([]int, 300)

	len1 := len(num1)
	len2 := len(num2)
	for i := 0; i < len1; i++ {
		a[len1 - i] = int(num1[i] - '0')
	}
	for i := 0; i < len2; i++ {
		b[len2 - i] = int(num2[i] - '0')
	}
	for i := 1; i <= len1; i++ {
		for j := 1; j <= len2; j++ {
			c[i + j - 1] += a[i] * b[j]
			if c[i + j - 1] >= 10 {
				c[i + j] += c[i + j - 1] / 10
				c[i + j - 1] %= 10
			}
		}
	}
	var p int
	if len1 < len2 {
		p = len1
	} else {
		p = len2
	}
	for i := p; i <= len1 + len2; i++ {
		if c[i] > 0 {
			p = i
		}
	}
	str := ""
	for i := p; i > 0; i-- {
		str += string(c[i] + '0')
	}
	return str
}

q172 阶乘后的零


题目传送门


题解

要求使用对数时间复杂度的算法来求解,是一道数学题。5和任何偶数相乘都会产生0,所以只需要统计数n里面含有5的数量就可以了。

func trailingZeroes(n int) int {
	res := 0
	for n > 0 {
		res += n / 5
		n /= 5
	}
	return res
}

q258 各位相加


题目传送门


题解

使用以下解法既简单又快,但是我还看到一位大佬更加简单的做法。

func addDigits(num int) int {
	for num >= 10 {
		num = num % 10 + num / 10
	}
	return num
}

通过找规律和总结去求解:

https://leetcode-cn.com/problems/add-digits/solution/san-bu-qing-song-li-jie-o1-by-data-t/


q461 汉明距离


题目传送门


题解

看到这道题就能想到异或运算,两个数异或运算,二进制位相同的是0,不同的是1,所以我们直接统计两个数异或运算以后的新数字二进制中1的数目即可,主流编程语言几乎都有统计一个数字二进制位中1的数目的内置函数.

func hammingDistance(x int, y int) int {
	return bits.OnesCount(uint(x ^ y))
}

不使用内置函数,由于uint32类型有32位,所以我们遍历32次,每次对数字取模2,模拟一个短除法,来统计给定的数字二进制中1的个数。

func hammingDistance(x int, y int) (res int) {
	for i := 0; i < 32; i++ {
		if x % 2 != y % 2 {
			res++
		}
		x /= 2
		y /= 2
	}
	return res
}

剑指 Offer 15. 二进制中1的个数


题目传送门


题解

这道题与上一道的汉明距离是类似的,都需要统计十进制数字的二进制中1的数量。由于uint32类型有32位,所以我们遍历32次,每次对数字取模2,模拟一个短除法,来统计给定的数字二进制中1的个数。

func hammingWeight(num uint32) (ans int) {
	for i := 0; i < 32; i++ {
		if num % 2 == 1 {
			ans ++
		}
		num /= 2
	}
	return
}

剑指 Offer 16. 数值的整数次方


题目传送门


题解

这道题使用快速幂来求解。

步骤:

  1. 判断指数n是否为负数,如果n为负数需要将x = 1 / x,然后n变成正数。
  2. 创建一个结果变量,因为是乘法运算,所以初始化为1。
  3. 创建循环,条件是指数x不为0。
  4. 在循环内部:如果指数当前为奇数,就将ans = ans * x,接着默认将x = x * x,然后将指数对半分n /= 2
func myPow(x float64, n int) (ans float64) {
	if n < 0 {
		x = 1 / x
		n = -n
	}
	ans = 1
	for n != 0 {
		if n%2 == 1 {
			ans = ans * x
		}
		x *= x
		n /= 2
	}
	return
}

剑指 Offer 17. 打印从1到最大的n位数


题目传送门


题解

打印1到10的n次幂即可。

func printNumbers(n int) (ans []int) {
	for i := 1; i < int(math.Pow(10, float64(n))); i++ {
		ans = append(ans, i)
	}
	return
}

你可能感兴趣的:(LeetCode,leetcode)