Golang语法的25个练习题:21至25题

2023-02-24
3分钟阅读时长

题目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

关注公众号获得更多精彩文章

公众号:程序员大兵