整数算法
整数算法
1.整数反转
/*
题目:整数反转
leetcode:7
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
输入:x = -123
输出:-321
输入:x = 123
输出:321
思路:利用取模取余运算,将数字部分反转,然后将反转后的数字部分与符号部分相乘
*/
func reverse(x int) int {
num := 0
for x != 0 {
tmp := x % 10
num = num*10 + tmp
x = x / 10
}
if num < math.MinInt32 || num > math.MaxInt32 {
return 0
}
return num
}
/*
解法2:转成字符串,前后换位置,再转成int
*/
func reverse2(x int) int {
a := 1
if x < 0 {
a = -1
x = -x
}
strX := []byte(fmt.Sprintf("%d", x))
length := len(strX)
for i := 0; i < length/2; i++ {
strX[i], strX[length-1-i] = strX[length-1-i], strX[i]
}
num, _ := strconv.Atoi(string(strX))
if num > math.MaxInt32 {
return 0
}
return num * a
}
func main() {
n := reverse2(-123)
fmt.Println(n)
}
2.验证回文数
/*
题目:回文数
leetcode:9
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
输入:x = 121
输出:true
输入:x = -121
输出:false
思路:
解法1:转成字符串,前后对比
解法2:反转数字,再与原来的对比
解法3:转成字符串,反转字符串,对比
*/
func isPalindrome(x int) bool {
strX := fmt.Sprintf("%d", x)
lenth := len(strX)
for i := 0; i < lenth/2; i++ {
if strX[i] != strX[lenth-i-1] {
return false
}
}
return true
}
/*
解法2:反转数字,再与原来的对比
*/
func isPalindrome2(x int) bool {
if x < 0 {
return false
}
num := 0
y := x
for y != 0 {
num = num*10 + y%10
y = y / 10
}
return x == num
}
func main() {
a := -121
n := isPalindrome2(a)
fmt.Println(n)
}
3.罗马数字转整数
/*
题目:罗马数字转整数
leetcode:13
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
输入: s = "III"
输出: 3
思路:遍历字符串,当前数值小于下一个数值,减去当前数值,否则加当前数值
罗马数字特点:下一个值比当前大,则当前值的符号为负,下一个值比当前小,则当前值为正。IV=-1+5=4,VI=5+1=6
*/
func romanToInt(s string) (ans int) {
m := map[byte]int{'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
lenth := len(s)
num := 0
for i := 0; i < lenth; i++ {
if i < lenth-1 && m[s[i]] < m[s[i+1]] {
num -= m[s[i]]
} else {
num += m[s[i]]
}
}
return num
}
func main() {
s := "IVI"
n := romanToInt(s)
fmt.Println(n)
}
选择了IT,必定终身学习