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
关注公众号获得更多精彩文章
