牛客春招刷题训练营-2025.4.4题解
活动地址: 牛客春招刷题训练营 - 编程打卡活动
简单题 查找组成一个偶数最接近的两个素数
- 定义一个函数 
isPrime来判断一个数是否为质数。 - 在 
main函数中读取用户输入的整数n。 - 从 
n/2开始(保证了刚开始差值最小,逐步增大)向下遍历,寻找两个质数i和n-i,使得它们的和等于n。 - 找到符合条件的两个质数后,输出它们并结束循环。
 
package main
import "fmt"
func isPrime(n int) bool {
	if n <= 1 {
		return false
	}
	for i := 2; i*i <= n; i++ {
		if n%i == 0 {
			return false
		}
	}
	return true
}
func main() {
	var n int
	fmt.Scan(&n)
	for i := n / 2; i >= 2; i-- {
		if isPrime(i) && isPrime(n-i) {
			fmt.Println(i)
			fmt.Println(n - i)
			break
		}
	}
}
中等题 最小循环节
因为题目说的是可以无限制的添加任意字符,最小循环节必由初始字符串原有的那些字符组成(因为如果我们再加入新的字符,会将循环节扩大),又要确保循环节覆盖到每一个已有字符,所以最小循环节的长度就等于已有字符串去重之后的长度。
package main
import (
	"fmt"
	"sort"
)
func main() {
	var s string
	fmt.Scan(&s)
	mp := make(map[rune]int)
	for _, c := range s {
		mp[c]++
	}
	ans := make([]rune, 0, len(mp))
	for k := range mp {
		ans = append(ans, k)
	}
	sort.Slice(ans, func(i, j int) bool {
		if mp[ans[i]] == mp[ans[j]] {
			return ans[i] < ans[j]
		}
		return mp[ans[i]] > mp[ans[j]]
	})
	fmt.Println(string(ans))
}
困难题 连续子数组最大和
- 
读取输入:从标准输入读取一个整数
n,表示数组的长度,然后读取n个整数,存储在数组a中。 - 
初始化动态规划数组:创建一个长度为
n的数组dp,其中dp[i]表示以第i个元素结尾的最大连续子数组和。初始化dp[0]为a[0]。 - 
动态规划递推:从
1到n-1遍历数组,对于每个位置i,可以选择:- 
将当前数加入前面的子数组:
dp[i-1] + a[i] - 
重新开始一个子数组:
a[i] 
 - 
 - 
求解结果:遍历
dp数组,找到其中的最大值,即为所求的最大子数组和。 
package main
import (
	"fmt"
	"math"
)
func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}
func main() {
	var n int
	fmt.Scan(&n)
	a := make([]int, n)
	for i := 0; i < n; i++ {
		fmt.Scan(&a[i])
	}
	dp := make([]int, n)
	dp[0] = a[0]
	for i := 1; i < n; i++ {
		dp[i] = max(dp[i-1]+a[i], a[i])
	}
	ans := math.MinInt
	for i := 0; i < n; i++ {
		ans = max(ans, dp[i])
	}
	fmt.Println(ans)
}
#牛客春招刷题训练营#牛客春招刷题训练营 文章被收录于专栏
 爱丽姐真是太好了
查看7道真题和解析
巨人网络公司福利 91人发布