15天大厂真题带刷 - ZT13小红的数字删除 | Go

小红的数字删除

https://www.nowcoder.com/practice/46a73f7cb2ab4a56bdb372b282b23c1e

题意

小红拿到了一个正整数,她每次可以删除其中一个数位,但必须保证每次删除后,该正整数都是3的倍数且大于0。小红想知道,自己最多可以进行多少次这样的删除操作?

思路

先说一个错误的思路,先计算出正整数的数位和,然后从头遍历字符串,如果删除这位后满足条件,就删除。这样无法得到最优解。

正解是根据数位和sum % 3 的值以及所有的数位里%3 的值的个数来讨论的,其实就是个思维题,但是边界条件太多了!

假设正整数的每一个数位%3等于1的个数为cnt1,数位%3等于2的个数为cnt2,数位%3等于0的个数为cnt0

题目要求删除后这个正整数是3的倍数,就说明删除后的sum%3一定为0

如果sum%3一开始就是0的话,那么只需要考虑cnt0的个数就可以。

但是如果数位和sum%3 =1的话,就需要先删除一位数位%3=1的使得sum%3=0,再考虑cnt0的个数。sum%3=2也同理。

以上就是这个题的基本思路,下面是各种边界条件处理:

  • 如果sum % 3 = 1 但是cnt1 = 0,也就是无法通过第一次删除使得sum%3=0,直接删除0即可。
  • 如果sum % 3 = 2 但是cnt2 = 0 也同理
  • 如果最后删除的个数ans 等于这个正整数的长度,说明把全部的数都删除了,ans需要减去1
  • 如果sum % 3 = 1 并且cnt1 = 1 ,也就是一开始只有一种删除的可能性,而且s[0] % 3 == 1,需要考虑删除了以后前导零的问题,样例2就是个很好的例子。这里要注意前导零造成影响的条件是删除这一位以后可以出现前导零,也就是第一位是1,后面跟着0才能有前导零影响

Go代码

package main

import (
	"fmt"
)

func main() {
	var T int
	fmt.Scan(&T)
	for i := 0; i < T; i++ {
		var s string
		fmt.Scan(&s)
		sum := 0
		cnt0, cnt1, cnt2 := 0, 0, 0
		for j := 0; j < len(s); j++ {
			now := int(s[j] - '0')
			sum += now
			switch now % 3 {
			case 0:
				cnt0++
			case 1:
				cnt1++
			case 2:
				cnt2++
			}
		}
	//	fmt.Println(cnt0, cnt1, cnt2, sum, sum%3)
        //一定不行的情况
        if sum % 3 == 1 && cnt1 == 0 {
            fmt.Println(0)
            continue
        }
        if sum % 3 == 2 && cnt2 == 0 {
            fmt.Println(0)
            continue
        }
		var ans int = cnt0
		//先把sum%3的数位删除一个 再删除%3=0的数位
		if sum%3 == 1 && cnt1 >= 1{
			ans ++
		}
		if sum%3 == 2 && cnt2 >= 1{
			ans ++
		}
		//不能全删除
		if ans == len(s) {
			ans--
		}
		//处理前导0
		if sum%3 == 1 && cnt1 == 1 && int(s[0]-'0') % 3 == 1 {
			for j := 1; j < len(s); j++ {
                if s[j] == '0' {
                    ans --
                }else{
                    break 
                }
			}
		}
		if sum%3 == 2 && cnt2 == 1 && int(s[0]-'0') % 3 == 2 {
			for j := 1; j < len(s); j++ {
                if s[j] == '0' {
                    ans --
                }else{
                    break 
                }
			}
		}
		fmt.Println(ans)
	}
}

/*
5
814788067
209592085
25
333
103252

3 0 0 2 2
*/

全部评论
佬是做的go业务吗可以私聊你一些问题吗
点赞 回复 分享
发布于 2024-11-22 18:56 云南
佬 ,错误的思路过不了吗 ,我就是错误的思路 写的 过了,不知道什么案例可以给hack orz
点赞 回复 分享
发布于 2024-11-21 22:15 云南

相关推荐

||&nbsp;先说下主播个人情况:211本,暑期实习之前有过一段中大厂的后端实习,暑期拿过腾讯的实习offer,综合考虑业务和语言最终去了美团。实习期间体感还是不错的,5月初去的,去了就一直急着要需求做,担心因为没有产出导致转正失败,在第二个星期就和mt透露我希望能够留用。虽然第一个由于美团新人landing的友好性基本没做什么需求,但是后面也写出了小2w行的代码量(不包含单测)。中期经常主动加班赶需求,经常持续一两个星期加班到10点甚至更后面。mt对我确实不错,也是言传身教,实习期间给我讲了很多关于单测,ddd,set化等的理解,也是受益匪浅,此外在做需求的时候,也能看出把比较有含金量的部分交给我做...
菜菜菜小白菜菜菜:我在字节实习了四个月,有转正的压力所以周末大部分也在公司自学,也是因为一些原因转正拖的很久,这个点还没答辩,过段时间才回去答辩。整个不确定性的焦虑贯穿了我的秋招三个月,我也曾经犹豫过是不是应该放弃转正走秋招更快,最后因为沉没成本一直舍不得放弃,前前后后七个月真的挺累的,尤其是没有来字节实习的同学已经校招拿到意向时更加焦虑。这段时间也跟mentor聊了很多次,他告诉我未来工作上或者生活上,比这些更头疼的事情会更多,关键还是要调整好自己的心态。转正没有通过从过程上来看其实跟你自身没太大的关系,拖了三个月不出结果显然是ld的问题,并且今年美团最近的开奖大家似乎都不是很乐观,所以不去也罢。我在字节实习的时候,6月份有一个赶上春招末期的25届同事刚面进来,也拿到了小sp的薪水。不要对这件事有太大的压力,时代的问题罢了
点赞 评论 收藏
分享
09-17 19:25
已编辑
太原理工大学 游戏测试
叁六玖:公司名发我,我要这个HR带我打瓦
我的秋招日记
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务