牛客春招刷题训练营-2025.4.7题解

活动地址: 牛客春招刷题训练营 - 编程打卡活动

简单题 查找输入整数二进制中1的个数

方案一:使用 bits.OnesCount 函数

package main

import (
	"fmt"
	"math/bits"
)

func main() {
	var n, m uint
	fmt.Scan(&n, &m)
	fmt.Println(bits.OnesCount(n))
	fmt.Println(bits.OnesCount(m))
}

方案二:手动实现 countBits 函数

其中 n &= n - 1 用来清除最右边的 1

package main

import (
	"fmt"
)

func countBits(n uint) int {
	count := 0
	for n > 0 {
		n &= n - 1
		count++
	}
	return count
}

func main() {
	var n, m uint
	fmt.Scan(&n, &m)
	fmt.Println(countBits(n))
	fmt.Println(countBits(m))
}

中等题 宝石手串

  • 将原字符串 s 复制一份并拼接(s += s),这样可以处理环形的情况
  • 用哈希表 mp 记录每个字符最后一次出现的位置
  • 对于每个字符,查看它上一次出现的位置,计算中间需要移动的最小距离
  • 最终答案就是所有相同字符对之间最小的移动距离
package main

import "fmt"

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

func solve(t int) {
	var (
		n int
		s string
	)
	fmt.Scan(&n, &s)
	s += s
	mp := make(map[rune]int)
	ans := n - 1
	for i, c := range s {
		if _, ok := mp[c]; ok {
			ans = min(ans, i-mp[c]-1)
		}
		mp[c] = i
	}
	if ans == n-1 {
		ans = -1
	}
	fmt.Println(ans)
}

func main() {
	var t int
	fmt.Scan(&t)
	for i := 0; i < t; i++ {
		solve(i)
	}
}

困难题 最长上升子序列(一)

方案一:线性DP 时间复杂度:

dp[i] 表示以第 i 个数结尾的最长递增子序列长度

  • 对于每个位置 i,初始化 dp[i] = 1(最短的递增子序列就是数字本身)
  • 遍历 i 前面的所有位置 j
  • 如果 a[i] > a[j],说明可以将第 i 个数接在以 j 结尾的递增子序列后面
  • 此时可以更新 dp[i] = max(dp[i], dp[j] + 1)
package main

import "fmt"

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

func main() {
	var n int
	fmt.Scanf("%d", &n)
	a := make([]int, n)
	for i := range a {
		fmt.Scanf("%d", &a[i])
	}
	dp := make([]int, n)
	dp[0] = 1
	for i := 1; i < n; i++ {
		dp[i] = 1
		for j := 0; j < i; j++ {
			if a[i] > a[j] {
				dp[i] = max(dp[i], dp[j]+1)
			}
		}
	}
	ans := 0
	for _, v := range dp {
		ans = max(ans, v)
	}
	fmt.Println(ans)
}

方案二:贪心 + 二分查找 时间复杂度:

我们可以维护一个子序列 dp,其中 dp[i] 表示长度为 i+1 的上升子序列的最小结尾值,保证 dp 子序列一定是递增的

遍历所有的元素,如果当前元素比子序列中的最后一个元素还大,就将其添加到子序列的末尾

否则,我们可以用二分查找找到子序列中第一个大于等于当前元素的位置,将该位置上的元素替换为当前元素,从而保证子序列仍然是上升的。

最终,子序列的长度就是最长上升子序列的长度。

package main

import (
	"fmt"
	"sort"
)

func main() {
	var n int
	fmt.Scanf("%d", &n)
	a := make([]int, n)
	for i := range a {
		fmt.Scanf("%d", &a[i])
	}
	var dp []int
	for _, x := range a {
		idx := sort.SearchInts(dp, x)
		if idx == len(dp) {
			dp = append(dp, x)
		} else {
			dp[idx] = x
		}
	}
	fmt.Println(len(dp))
}

#牛客春招刷题训练营#
牛客春招刷题训练营 文章被收录于专栏

爱丽姐真是太好了

全部评论

相关推荐

03-16 16:25
门头沟学院 Java
艰难学习Java的鼠鼠:小林coding的解释: GET 和 POST 是 HTTP 协议中两种常用的请求方法,它们在不同的场景和目的下有不同的特点和用法。一般来说,可以从以下几个方面来区分二者(重点搞清两者在语义上的区别即可): 语义(主要区别):GET 通常用于获取或查询资源,而 POST 通常用于创建或修改资源。 幂等:GET 请求是幂等的,即多次重复执行不会改变资源的状态,而 POST 请求是不幂等的,即每次执行可能会产生不同的结果或影响资源的状态。 格式:GET 请求的参数通常放在 URL 中,形成查询字符串(querystring),而 POST 请求的参数通常放在请求体(body)中,可以有多种编码格式,如 application/x-www-form-urlencoded、multipart/form-data、application/json 等。GET 请求的 URL 长度受到浏览器和服务器的限制,而 POST 请求的 body 大小则没有明确的限制。不过,实际上 GET 请求也可以用 body 传输数据,只是并不推荐这样做,因为这样可能会导致一些兼容性或者语义上的问题。 缓存:由于 GET 请求是幂等的,它可以被浏览器或其他中间节点(如代理、网关)缓存起来,以提高性能和效率。而 POST 请求则不适合被缓存,因为它可能有副作用,每次执行可能需要实时的响应。 安全性:GET 请求和 POST 请求如果使用 HTTP 协议的话,那都不安全,因为 HTTP 协议本身是明文传输的,必须使用 HTTPS 协议来加密传输数据。另外,GET 请求相比 POST 请求更容易泄露敏感数据,因为 GET 请求的参数通常放在 URL 中。 再次提示,重点搞清两者在语义上的区别即可,实际使用过程中,也是通过语义来区分使用 GET 还是 POST。不过,也有一些项目所有的请求都用 POST,这个并不是固定的,项目组达成共识即可。
点赞 评论 收藏
分享
导❤师❤不❤在❤实验室,一个人❤投❤投❤投简历最香❤岗位,校招生无法抗拒❤薪资一、面试流程:‌面试通常包含自我介绍、‌项目介绍、‌技术提问等环节。‌自我介绍后,‌面试官会深入了解简历中所做的项目,‌包括使用的技术、‌遇到的困难及解决方法。‌技术提问可能涵盖编程语言、‌数据结构、‌算法、‌计算机网络等多个方面‌。‌面试内容深度:‌涉及基础知识的深度考察,‌如Java集合、‌多线程、‌锁等,也可能手撕代码面试氛围与感受:‌整体面试氛围较为轻松,‌面试官态度友好,‌会给予应聘者积极的回应和引导。‌答不出来也会给予提示,耐心引导,整体比较愉快二、滴滴2025届校招提前批正式启动啦!🚘岗位类别工程类/算法类/机器人类/数据类/安全技术类/产品类/运营类/职能类等🚘投递要求2024年9月~2025年8月之间毕业的海内外高校毕业生,每人可投递1个岗位🚘工作地点北京/杭州/上海/广州等🚘招聘流程简历投递-简历筛选-笔试-面试-Offer发放三、面试预约:滴滴面试采用预约制,因为面试的候选人比较多,收到面试预约邮件后尽早选择合适的面试时间,面试席位预约满后会提前关闭,就约不上啦,如果已经招到了合适的候选人,后续就不一定再约面试了,所以一定要尽早选择面试时间,如果没有什么特别的事,也尽量不要修改面试时间四、竞争比较小,进面概率较高岗位:去年秋招是前端,算法,客户端,今年HR同步之后给大家更新,不过也大差不差比较卷的岗位:后端,各个大厂后端简历量都比较多,安排起来就会比较慢,大家耐心等待吧,也可以考虑投一下客户端公司福利薪资在大厂中也算是比较有竞争力的,节假日各种礼包,桔厂周边,校招礼包,司庆礼盒少不了,速来来解锁,小零食,免费晚饭工作氛围我觉得能算得上大厂中的WLB吧,早上10点左右上班,实习生晚上6点左右走,正式员工有工作的话会稍微晚一点,整个工作氛围比较轻松,mentor也比较nice,有工作生活方面的问题可以多找mentor聊聊。身边的同事也都很不错,更重要一点,没有什么学历歧视,大家就算学校不是特别好也不用担心,滴滴也是很注重候选人个人素质的,所以好好准备🚘投递方式【内推链接】https://app.mokahr.com/m/campus_apply/didiglobal/96064?recommendCode=DSW46Dg7&amp;amp;amp;hash=%23%2Fjobs#/jobs【内推码】DSW46Dg7立刻投递,快人一步,抢跑未来全流程跟进,投递的同学评论区留言,方便后续跟进,秋招加油!#应届# #校招# #滴滴# #滴滴出行# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务