Golang语法的25个练习题:21至25题
题目21:三个数取最大数
己知数字a,b,c分别为10,6,18
找出a,b,c中最大的数字(不借助函数以及列表等方式)
我们知道函数max可以直接获取到最大值,或者可以把数字添加到列表里,通过排序也能获取到最大数字,我们单纯使用if分支来实现
package main
import "fmt"
func main() {
a, b, c := 10, 6, 8
max := a
if max < b {
max = b
}
if max < c {
max = c
}
fmt.Println(max)
}
题目22:因子之和“完数”
什么是因子?
因子就是所有可以整除这个数的数字,包括1但不包括这个数自身。比如8的因子有1,2,4
什么是完数?
一个数如果恰好等于它的因子之和,这个数就称为“完数”,打印输出1000以内的完数,例如6=1+2+3,6就是“完数
package main
import "fmt"
func main() {
for i := 1; i < 1000; i++ {
if i == factorSum(i) {
fmt.Println("//", i)
}
}
// output:
// 6
// 28
// 496
}
func factorSum(n int) int {
sum := 0
for i := 1; i < n; i++ {
if n%i == 0 {
sum += i
}
}
return sum
}
题目23:递归阶乘求和
一个正整数的阶乘(factorial)是所有小于及等于该数的正整数之积,并且0的阶乘为1
如5!=1*2*3*4*5
计算1!+2!+3!+4!+5!+…+10!
关系表达式【f(n) = n*f(n-1)】
package main
import "fmt"
func main() {
sum := 0
for i := 1; i < 11; i++ {
sum += factor(i)
}
fmt.Println("//", sum) // 4037913
}
func factor(n int) int {
if n <= 1 {
return 1
}
// 可以增加记忆化
return n * factor(n-1)
}
题目24:有效的括号
给定一个只包括’(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合
- 左括号必须以正确的顺序闭合
- 空字符串可被认为是有效字符串
示例 1: 输入:"()" 输出:True
示例 2: 输入:"()[]{}" 输出:True
示例 3: 输入:"(]" 输出:False
示例 4: 输入:"([)]" 输出:False
解法一:字符串替换法
在字符串中找成对的()、[]、{},找到后替换成空
使用for循环,不停判断是否存在成对的小括号中括号大括号,如果存在就使用replace替换成空
直到无法再替换的时候,再判断下当前的字符串是否为空,如果为空说明字符串是有效的,如果不为空说明字符串是无效的
package main
import (
"fmt"
"strings"
)
func main() {
fmt.Println(validVtr("()")) // true
fmt.Println(validVtr("()[]{}")) // true
fmt.Println(validVtr("()[]{[()]}")) // true
fmt.Println(validVtr("()[]{[(}]}")) // false
}
func validVtr(str string) bool {
if len(str)%2 == 1 {
return false
}
for str != "" {
pre := str
str = strings.ReplaceAll(str, "()", "")
str = strings.ReplaceAll(str, "[]", "")
str = strings.ReplaceAll(str, "{}", "")
if pre == str {
return false
}
}
return true
}
解法二:利用栈的后进先出原则
先去定义一个空栈,对当前栈进行循环遍历,遇到左括号我们就把当前的左括号添加到栈里面,遇到右括号,我们就和栈顶元素进行比对
看它们是不是成对的括号,如果是,就把当前的元素出栈,直到字符串遍历结束之后,我们再来看下字符串是不是空的,如果是空的说明字符串是有效的,如果不为空说明字符串是无效的
package main
import (
"fmt"
)
func main() {
fmt.Println(validVtr("()")) // true
fmt.Println(validVtr("()[]{}")) // true
fmt.Println(validVtr("()[]{[()]}")) // true
fmt.Println(validVtr("()[]{[(}]}")) // false
}
func validVtr(str string) bool {
if len(str)%2 == 1 {
return false
}
ht := map[rune]rune{
')': '(',
']': '[',
'}': '{',
}
var stack []rune
for _, ch := range str {
if c, ok := ht[ch]; ok {
if len(stack) == 0 || stack[len(stack)-1] != c {
return false
}
stack = stack[:len(stack)-1]
} else {
stack = append(stack, ch)
}
}
return len(stack) == 0
}
题目25:回文数的两种解法
回文数是指正序(从左向右)和倒序(从右向左)都是一样的整数。例如,1221是回文,而1222不是。
解法一:通过逆转字符串进行比对
package main
import (
"fmt"
"strconv"
)
func main() {
fmt.Println(isPalindrome(121)) // true
fmt.Println(isPalindrome(120)) // false
}
func isPalindrome(x int) bool {
if x < 0 || x > 0 && x%10 == 0 {
return false
}
str := strconv.Itoa(x)
return str == ReverseString(str)
}
func ReverseString(str string) string {
strArr := []rune(str)
for i := 0; i < len(strArr)/2; i++ {
strArr[len(strArr)-1-i], strArr[i] = strArr[i], strArr[len(strArr)-1-i]
}
return string(strArr)
}
解法二:反转一半数字和前半部分的数字进行比较
流程
- 对于整数x,后半部分reverted
- 每次循环x%10拿到末尾数字
- 然后x/10去除末尾的数字
- 循环结束条件x<=reverted
数字长度(奇数) 12321
数字长度(偶数) 1221
package main
import (
"fmt"
)
func main() {
fmt.Println(isPalindrome(1221)) // true
fmt.Println(isPalindrome(1223)) // false
fmt.Println(isPalindrome(123321)) // true
}
func isPalindrome(x int) bool {
if x < 0 || x > 0 && x%10 == 0 {
return false
}
reverted := 0
for x > reverted {
reverted, x = reverted*10+x%10, x/10
}
return x == reverted || x == reverted/10
}
python原文:https://www.52pojie.cn/thread-1689186-1-1.html