[贝壳找房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

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

被折叠的 条评论
为什么被折叠?



