春招第一个算法笔试 北京博***有限公司 游戏开发

已经很久没碰算法了,对我来说这个笔试题非常之难,没有100%通过的题

1.一组字符串类似下面:

判断每个字符串是否都能通过一个轨迹得到

现在来看其实非常简单,只需要不断递归,每次向四个方向查找,如果是下一个字符,就继续递归,否则返回false,直到四个三个方向都返回false或者找到整个字符串

输入:
map = [
        ['a', 'b', 'c', 'e'],
        ['s', 'f', 'c', 's'],
        ['a', 'd', 'e', 'e']
    ]
strArr = ["abc", "ass", "bad", "see", "fcs"]
返回:[True, False, False, True, True]

实现代码参考:

from typing import List

class Solution:
    def findWords(self, map: List[List[str]], strArr: List[str]) -> List[bool]:
        row = len(map)
        col = len(map[0])
        visited = [[False]*col for _ in range(row)]

        def find_index(i, j, index, word):
            if len(word) <= index:
                return True
            if i < 0 or i >= row or j < 0 or j >= col \
                or visited[i][j] or map[i][j] != word[index]:
                return False
            # 当前元素等于word[index],遍历寻找下一个
            visited[i][j] = True
            found = find_index(i-1, j , index + 1, word) or \
                    find_index(i+1, j , index + 1, word) or \
                    find_index(i, j-1, index + 1, word) or \
                    find_index(i, j+1, index + 1, word)
            visited[i][j] = False
            print(found)
            return found
        re = []
        for word in strArr:
            if len(word) == 0:
                re.append(False)
                continue
            found = False
            for i in range(row):
                for j in range(col):
                    if map[i][j] == word[0]:
                        found = find_index(i, j, 0, word) or found
            re.append(found)
        return re
    
if __name__=="__main__":
    map = [
        ['a', 'b', 'c', 'e'],
        ['s', 'f', 'c', 's'],
        ['a', 'd', 'e', 'e']
    ]
    strArr = ["abc", "sad", "saf", "fcd"]
    re = Solution().findWords(map, strArr)
    print(re)

2.考察给一个整数n,判断所有从[1,n]的整数中字符1-9出现的次数

当时给我整蒙了,后来问deepseek搞明白了,其实思路也挺简单,就是每一次只判断某一位出现某个数的次数

比如:先算从[1-n] 所有整数的个位出现1的次数,很容易,比如 51000就出现5101次,然后依次计算出现2、3...,十位百位

参考代码:

from typing import List

class Solution:
    def CountNumber(self, n:int) -> List[int]:
        result = [0]*10

        def count_one_number(digtal, n):
            i = 1
            while i <= n:  # 注意这里是<= ,如果是< ,当最高位为1是会漏掉一个1
                driver = i*10  # 用来分割位数,将数字分割为 high, cover, low
                high = n // driver
                cover = (n //i)% 10
                low = n % i
                # 单独处理0
                if digtal == 0:
                    if high == 0:
                        # 高位为0,当前数是前导0,不机算
                        i *= 10
                        continue
                    if cover == 0:
                        # 当前位为0, 高位有 high个值可选(比如high=2时,可选1,2),但是高位不变时,低位只有 low+1 个值可选
                        result[digtal] += (high-1) * i + (low + 1)
                    elif cover > 0:
                        # 高位 有high个值可选,低位所有值可选
                        result[digtal] += high * i
                else:
                    # 当前位不为0时
                    if cover == digtal:
                        # 当前位于digtal一致,高位有 high+1个值可选(包括0), 当高位为0时,低位只有low+1个值可选
                        result[digtal] += high*i + (low + 1)
                    elif cover > digtal:
                        # 当前位大于digtal,高位有 high+1个值可选(包括0)
                        result[digtal] += (high+1) * i
                    else:
                        # 当前位小于digtal,高位只有high个值可选(0不行)
                        result[digtal] += high * i
                # 处理完当前位,处理下一位
                i *= 10

        for i in range(10):
            count_one_number(i, n)
        return result

    

if __name__=="__main__":
    re = Solution().CountNumber(100000)
    print(re)

3.写希尔排序,给出移动的次数

这个以前应该也没接触过,接触过也早忘了,待会学一下

学成归来,感觉好简单:- _ - 等啥时候常见的排序算法都得重新学习一下

from typing import List

class Solution:
    def shell_sort(self, numlist: List[int], gaplist: List[int]) -> int:
        count = 0
        for gap in gaplist:
            for i in range(gap, len(numlist)):
                j = i # j表示当前需要决定的位置(若temp大于前一个值就将temp插入这里,否则后移前一个元素,判断更前面一个)
                temp = numlist[j]
                while j >= gap and temp < numlist[j-gap]:
                    numlist[j] = numlist[j - gap]
                    j -= gap
                    count += 1
                numlist[j] = temp
        return count
    
if __name__ == "__main__":
    sol = Solution()
    arr = [9, 8, 7, 6, 5, 4, 3, 2, 1,10,11,5,2,3,6,2,1,6,11]
    gaps = [4, 2, 1]
    print("初始数组:", arr)
    moves = sol.shell_sort(arr, gaps)
    print("\n最终排序结果:", arr)
    print("总移动次数:", moves)

4.划船,多少次能划到岸边,描述是第一次能划x米,然后休息,倒退y米,每一次休息都减少下一次1/5的移动距离,判断划几次能到m米的岸边

这个刚写的时候给我搞出等比数列去了,我以为会上很大的数,其实这么简单就过了

正确代码参考:

from typing import List

class Solution:
    def HuaChuang(self, x:float, y: float, m:float) -> List[int]:
        now_x = x
        total = 0
        count = 0

        while total < m:
            if now_x <= y:
                return -1
            total = total + now_x - y
            now_x *= 0.8
            count += 1
        return count
            
if __name__=="__main__":
    re = Solution().HuaChuang(10900,2,39900)
    print(re)     

第一次写的代码:

等有时间看看哪里错了

from math import log, pow
class Solution:
    def max_len(self, x: float, y: float, n: int) -> bool:
        sum_ = x*(1 - pow(0.8, n))/(0.2) - y*n
        return sum_

    def rowTheBoat(self , x: float, y: float, m: float) -> int:
        # 没x米休息一次,每次休息退行y米,起始距离为m米,问最终能到达终点吗
        # l1 = x - y
        # l2 = x*(4/5) - y
        # l3 = x*(4/5)^2 - y
        # l4 = x*(4/5)^3 - y
        # ...
        # l_last = x*(4/5)^n - y = 0
        # y = x*(4/5)^n
        n = log(y/x, 0.8)
        n = int(n)
        # sum =  l1 + l2 + l3 + ... + l_last = x*(1 + (4/5) + (4/5)^2 + ... + (4/5)^n) - y*n
        # sum = x*(1 - pow(0.8, n + 1))/(0.2) - y*n
        sum = self.max_len(x, y, n)
        if sum < m:
            # 判断再来一次是否可以
            if sum + x*(0.8**(n)) + x*(0.8**(n)) >= m:
                return n + 1
            else:
                return -1
        while self.max_len(x, y, n) >= m:
            n = n // 2
        while self.max_len(x, y, n) < m:
            n = n + 1
        return n

25年春招笔试面试记录 文章被收录于专栏

记录一下春招的笔面试

全部评论

相关推荐

04-17 23:37
门头沟学院 Java
18岁,网吧老板烟头摁灭在《C语言入门》封面上:“这行来钱快。”你填志愿时勾选“计算机科学与技术”,屏幕右下角的QQ宠物正啃着像素化的生日蛋糕。母亲端来泡面的蒸汽里,“Java方向”的选项框洇开了水渍。&nbsp;&nbsp;20岁,凌晨的机房,教授敲着掉漆的键盘:“一个分号写错,整个系统就能崩溃。”你删掉第17行代码里的逻辑错误,走廊尽头的服务器指示灯猩红闪烁,像老板承诺的年底分红。&nbsp;&nbsp;22岁,秋招会上大厂HR把你的简历推回来:“我们只要985、211的。”考研失败那夜,你在后街烧烤摊撕碎一沓Leetcode打印稿,纸屑飘成区块链白皮书的形状。最终进了外包公司,发现甲方需求文档漏洞百出,项目经理却说“能跑就行”。&nbsp;&nbsp;25岁,相亲对象听说你996,第二次约会就没了下文。在出租屋改bug到凌晨三点,合租室友的醉酒呕吐声混着编译器报错音。朋友圈弹出前室友的动态——挂科四门的家伙正晒字节工牌,配文“终于年薪三十万”。&nbsp;&nbsp;28岁,跳槽到创业公司首周,女儿确诊肺炎。你在儿童医院走廊用笔记本紧急修复生产环境故障,点滴声与服务器日志滚动节奏莫名同步。天亮时发现少写一个异常捕获,修改时打翻的退烧药浸透了键盘。&nbsp;&nbsp;30岁,考过系统架构师那天,公司宣布解散。抱着盆栽离开写字楼时,玻璃幕墙倒映出你稀疏的头顶——和隔壁“元宇宙孵化基地”广告屏里的虚拟发量一样虚幻。妻子发来语音:“早教班催缴下半年费用”。&nbsp;&nbsp;35岁,转行做的IT培训班只剩三个学员。某晚教儿子用Scratch,他指着你珍藏的《Thinking&nbsp;in&nbsp;Java》说:“爸,现在都学Go语言了。”书页间夹着的2003年微软认证证书,折痕深得像IE浏览器的退役公告。&nbsp;&nbsp;40岁,送外卖途中撞见前同事。他的特斯拉方向盘上挂着“XX科技CTO”工牌,递来的烟盒印着区块链峰会logo。你捏紧电量只剩18%的二手电瓶车钥匙,听他摇上车窗前的最后一句话:“当年你写的代码从不出bug”。&nbsp;&nbsp;50岁,儿子填报志愿那晚,你找出泛黄的机械键盘。“爸,你做过最牛的项目是什么?”窗外的无人机表演照亮天际,手机突然亮起——某P2P公司需要抢救遗留系统,时薪80。你默默把布洛芬塞进背包。&nbsp;&nbsp;55岁,腰椎间盘突出让你告别编码。在某大厦当夜间网管的雨夜,监控屏里年轻人争论着:“ChatGPT根本写不了核心代码!”“未来不需要程序员!”你擦拭着钥匙扣上的32GB古董U盘,里面存着1999年写的第一个“Hello&nbsp;World”。&nbsp;&nbsp;60岁,同学群转发“量子计算与AI替代”研讨会直播链接时,你正给孙子组装二手乐高机器人。孩子突然举起你1998年的软盘:“爷爷,这是你小时候的WiFi吗?”
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务