25届-8.28毒秋招(研发岗)-改编题

💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历

👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸

✨ 合集传送们 -> 🧷学长刷题笔记

🍒 本专栏已收集 140+ 套题 🍄 题面描述等均已改编,如果和你实际看到的题面描述不一样请理解,做法和题目本质基本不变。

🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力 💞

alt

🍥 本套卷难度较简单

1️⃣ 比较简单,可以直接扔一个BFS或者用数学的做法

2️⃣ 看清本质后发现是求最长连续1

3️⃣ 前几天b站考过的原题,分类讨论下即可

🚙 01.密码箱的最短路径

问题描述

LYA 收到了一个神秘的密码箱作为生日礼物。这个密码箱上有四个数字转盘,每个转盘上的数字范围是 0 到 9。LYA 想要打开这个密码箱,她可以进行以下操作:

  1. 将任意一个转盘的数字向下调整一位(例如,9 变成 8,0 变成 9)。
  2. 将任意一个转盘的数字向上调整一位(例如,8 变成 9,9 变成 0)。

LYA 知道密码箱的初始状态和目标状态,她想知道最少需要多少次操作才能从初始状态达到目标状态。你能帮助她解决这个问题吗?

输入格式

输入包含两个长度为 4 的字符串,用空格分隔。这两个字符串分别表示密码箱的初始状态和目标状态,每个字符都是一个 0 到 9 之间的数字。

输出格式

输出一个整数,表示从初始状态到达目标状态所需的最小操作次数。

样例输入

9999 8888

样例输出

4

数据范围

  • 输入的两个字符串长度均为 4。
  • 字符串中的每个字符都是 0 到 9 之间的数字。

题解

直接上BFS 或者 数学的办法考虑一下相减

参考代码

  • Python
from collections import deque

def bfs(start, target):
    # 初始化队列和已访问集合
    queue = deque([(start, 0)])
    visited = set([start])
    
    while queue:
        state, steps = queue.popleft()
        # 如果达到目标状态,返回步数
        if state == target:
            return steps
        
        # 尝试所有可能的下一个状态
        for i in range(4):
            for d in (-1, 1):
                # 计算新的状态
                new_digit = (int(state[i]) + d) % 10
                new_state = state[:i] + str(new_digit) + state[i+1:]
                # 如果新状态未被访问过,加入队列
                if new_state not in visited:
                    visited.add(new_state)
                    queue.append((new_state, steps + 1))
    
    # 如果无法到达目标状态,返回-1
    return -1

# 读取输入
start, target = input().split()

# 计算并输出结果
print(bfs(start, target))
  • Java
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String start = scanner.next();
        String target = scanner.next();
        scanner.close();

        System.out.println(bfs(start, target));
    }

    static int bfs(String start, String target) {
        Queue<String> queue = new LinkedList<>();
        Set<String> visited = new HashSet<>();
        Map<String, Integer> steps = new HashMap<>();

        queue.offer(start);
        visited.add(start);
        steps.put(start, 0);

        while (!queue.isEmpty()) {
            String state = queue.poll();
            if (state.equals(target)) {
                return steps.get(state);
            }

            for (int i = 0; i < 4; i++) {
                for (int d = -1; d <= 1; d += 2) {
                    char[] chars = state.toCharArray();
                    chars[i] = (char) (((chars[i] - '0' + d + 10) % 10) + '0');
                    String newState = new String(chars);
                    if (!visited.contains(newState)) {
                        visited.add(newState);
                        queue.offer(newState);
                        steps.put(newState, steps.get(state) + 1);
                    }
                }
            }
        }

        return -1; // 如果无法到达目标状态
    }
}
  • Cpp
#include <iostream>
#include <queue>
#include <unordered_set>
#include <string>
using namespace std;

int bfs(string start, string target) {
    queue<pair<string, int>> q;
    unordered_set<string> visited;

    q.push({start, 0});
    visited.insert(start);

    while (!q.empty()) {
        auto [state, steps] = q.front();
        q.pop();

        if (state == target) {
            return steps;
        }

        for (int i = 0; i < 4; ++i) {
            for (int d = -1; d <= 1; d += 2) {
                string new_state = state;
                new_state[i] = ((new_state[i] - '0' + d + 10) % 10) + '0';
                if (visited.find(new_state) == visited.end()) {
                    visited.insert(new_state);
                    q.push({new_state, steps + 1});
                }
            }
        }
    }

    return -1; // 如果无法到达目标状态
}

int main() {
    string s

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

本专栏短期内不再更新,请勿继续订阅

全部评论
算法岗的宝子们不急哈,明日更新~
点赞 回复 分享
发布于 2024-08-28 22:09 江苏

相关推荐

06-10 21:15
门头沟学院 Java
宁阿:好多这种没🧠的公司,他们估计都不知道毕业的人不能给安排实习岗
实习吐槽大会
点赞 评论 收藏
分享
06-13 17:33
门头沟学院 Java
顺序不记了,大致顺序是这样的,有的相同知识点写分开了1.基本数据类型2.基本数据类型和包装类型的区别3.==和equals区别4.ArrayList与LinkedList区别5.hashmap底层原理,put操作时会发生什么6.说出几种树型数据结构7.B树和B+树区别8.jvm加载类机制9.线程池核心参数10.创建线程池的几种方式11.callable与runnable区别12.线程池怎么回收线程13.redis三剑客14.布隆过滤器原理,不要背八股,说说真正使用时遇到了问题没有(我说没有,不知道该怎么回答了)15.堆的内存结构16.自己在写项目时有没有遇见过oom,如何处理,不要背八股,根据真实经验,我说不会17.redis死锁怎么办,watchdog机制如何发现是否锁过期18.如何避免redis红锁19.一个表性别与年龄如何加索引20.自己的项目的QPS怎么测的,有没有真正遇到大数量表21.说一说泛型22.springboot自动装配原理23.springmvc与springboot区别24.aop使用过嘛?动态代理与静态代理区别25.spring循环依赖怎么解决26.你说用过es,es如何分片,怎么存的数据,1000万条数据怎么写入库中27.你说用limit,那么在数据量大之后,如何优化28.rabbitmq如何批次发送,批量读取,答了延迟队列和线程池,都不对29.计网知不知道smtp协议,不知道写了对不对,完全听懵了30.springcloud知道嘛?只是了解反问1.做什么的?短信服务,信息量能到千万级2.对我的建议,基础不错,但是不要只背八股,多去实际开发中理解。面试官人不错,虽然没露脸,但是中间会引导我回答问题,不会的也只是说对我要求没那么高。面完问我在济宁生活有没有困难,最快什么时候到,让人事给我聊薪资了。下午人事打电话,问我27届的会不会跑路,还在想办法如何使我不跑路,不想扣我薪资等。之后我再联系吧,还挺想去的😭,我真不跑路哥😢附一张河科大幽默大专图,科大就是大专罢了
查看30道真题和解析
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

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