牛客网真题训练记录(一)(python)

本文详述了三道C++工程师笔试题目,包括字符串处理、施肥问题和奇特区间数的解题思路及优化过程。从最初的朴素解法到观察规律和运用高效数据结构,如哈希表,进行优化,展示了算法在解决实际问题中的重要作用。

[贝壳找房c++工程师笔试卷]:

例一:

在这里插入图片描述
先利用set函数提取出s字符串中出现过的字母,将其变成list类型后sort,直接找出前k个就是需要在S中删除的字母,在S中依次删除即可 s=s.replace(i,“”)

class Solution:
    def NS_String(self , s , k ):
        # write code here
        sset=set(s)
        sset=list(sset)
        sset.sort()
        for i in sset[:k]:
            s=s.replace(i,"")
        return s

在这里插入图片描述

先重温下常用set()函数的使用:

s="caabeefa"
s_set=set(s)

s_set={‘a’, ‘c’, ‘e’, ‘b’, ‘f’}

初始解答:dfs方法

想法很简单,就是循环找s中的ascii码最小的字符,然后都删除
s=list(filter(lambda x : x != tmp,s))
(list和filter的组合使用)
通过了10/11,第11例解答错误,说明还有没想到的测试用例。
本来简单的题,计时的情况下容易手比脑子先动,需要多练练

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param s string字符串 
# @param k int整型 
# @return string字符串
#
class Solution:
    def NS_String(self , s , k ):
        # write code here
        #找到s中ascii码最小的字符
        def mins(se):
            tmp = float('inf')
            for ch in se:
                if ord(ch) < tmp:
                    tmp = ord(ch)
            return chr(tmp)

        if k <= 0:
            return None
        s = list(s)
        res=[] #记录答案

        def dfs(res,k,s):
            if k<=0:
                res=s
                return res #到了k次,把res返回

            tmp=' '
            for ch in s:
                if ch == mins(s):
                    tmp=ch
                    break
            s=list(filter(lambda x : x != tmp,s)) #删除list s中的所有tmp字符
            res=dfs(res,k-1,s)
            if res: #k为其他时,res为None;只有返回了res时才为True
                return res 
        res=dfs(res,k,s)
        return "".join(res) #list s转str s

例二

在这里插入图片描述

初始解答:循环m次,一次次加(超时)

用一个循环记录每一行加肥料的过程
用一个flag记录正趟还是反趟,cnt记录在哪一行(一共n行),res记录结果
flag1表示是正向,如果是正向,cnt+=1,res[cnt]+=1,到了cntn,flag=0
flag0表示是反向,如果是反向,cnt-=1,res[cnt]+=1,到了cnt1,flag=1

class Solution:
    def FarmerNN(self , n , m ):
        # write code here
        res=[0]*(n+1)
        flag=1 #正向
        cnt=0 #记录在哪个格子
        for i in range(m):
            if flag==1:#如果正向
                cnt+=1
                res[cnt]+=1
                if cnt==n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值