func plusOne(digits []int) []int {
length := len(digits)
for i:= length-1; i>=0; i-- {
digits[i]++
digits[i] = digits[i]%10
if digits[i] != 0 {
return digits
}
}
ret := make([]int, length+1)
ret[0] = 1
copy(ret[1:], digits)
return ret
}
=%10
,进位=/10
func addStrings(num1 string, num2 string) string {
length1, length2 := len(num1), len(num2)
ret := ""
for i, j, sign := length1-1, length2-1, 0; i >=0 || j >= 0 || sign>0; i,j = i-1,j-1 {
var n1, n2 int
if i >= 0 {
n1 = getNum(num1[i])
}
if j >= 0 {
n2 = getNum(num2[j])
}
v := n1 + n2 + sign
ret = strconv.Itoa(v%10) + ret
sign = v/10
}
return ret
}
func getNum(str byte) int {
return int(str-'0')
}
=%2
,进位=/2
func addBinary(a string, b string) string {
length1, length2 := len(a), len(b)
str := ""
for i,j,sign := length1-1, length2-1, 0; i>=0 || j>=0 || sign>0; i,j = i-1,j-1{
var n1, n2 int
if i >= 0 {
n1 = int(a[i]-'0')
}
if j >= 0 {
n2 = int(b[j]-'0')
}
v := n1 + n2 + sign
str = strconv.Itoa(v%2) + str
sign = v/2
}
return str
}
func isPowerOfTwo(n int) bool {
if n <= 0 {
return false
}
for n%2==0 {
n = n/2
}
return n==1
}
n&(n-1)==0
或者n&(-n)==n
如果存在非负整数k
使得 n=2^k
,则n
的二进制表示为1
后面跟k
个0
。
所以,正整数n
是2
的幂,当且仅当n
的二进制表示中只有最高位是1
,其余位都是0
,此时满足 n&(n-1)=0
func isPowerOfTwo(n int) bool {
return n>0 && n&(n-1)==0
}
func isPowerOfTwo(n int) bool {
return n>0 && n&(-n)==n
}
func isPowerOfTwo(n int) bool {
max := 1<<30
return n>0 && max%n == 0
}
func isPowerOfThree(n int) bool {
if n <= 0 {
return false
}
for n%3==0 {
n = n/3
}
return n == 1
}
在32位有符号整数的范围内,最大的3的幂为3^19=1162261467
,判断n是否能被该数整除,即n是否是该数的约数即可。
func isPowerOfThree(n int) bool {
return n>0 && 1162261467%n==0
}
func isPowerOfFour(n int) bool {
if n <= 0 {
return false
}
for n%4 == 0 {
n = n/4
}
return n==1
}
n&0xaaaaaaaa==0
4 的一些幂次的二进制表示:
4^0 = 1,二进制表示:0001
4^1 = 4,二进制表示:0100
4^2 = 16,二进制表示:10000
4^3 = 64,二进制表示:1000000
…
这些幂次的二进制表示中,只有一个位是 1,而且这个 1 总是出现在奇数的位置上(从右数,从 0 开始计数)
func isPowerOfFour(n int) bool {
return n > 0 && n & (n-1) == 0 && (n & 0xaaaaaaaa) == 0
}
n%3==1
一个整数 n 对 3 取余的结果只可能是 0、1 或 2。如果一个数的二进制表示中只有一个位是 1,并且这个 1 出现在奇数的位置上,那么这个数对 3 取余的结果就是 1。
func isPowerOfFour(n int) bool {
return n > 0 && n & (-n)==n && n%3==1
}