【备战秋招】每日一题:2023.05-B卷-华为OD机试 - 阿里巴巴找黄金宝箱(III)

2023大厂笔试模拟练习网站(含题解)
www.codefun2000.com
最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据,挂载到我们的OJ上,供大家学习交流,体会笔试难度。现已录入200+道互联网大厂模拟练习题,还在极速更新中。欢迎关注公众号“塔子哥学算法”获取最新消息。

提交链接:

首页 - CodeFun2000

为了更好的阅读体检,可以查看OJ上的题解。进入提交链接,点击右边菜单栏的"查看塔子哥的题解"

题目描述

贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0-N的箱子,每个箱子上面贴有一个数字。

阿里巴巴念出一个咒语数字,查看宝箱是否存在两个不同箱子,这两个箱子上贴的数字相同,同时这两个箱了的编号之差的绝对值小于等于咒语数字,

如果存在这样的一对宝箱,请返回最先找到的那对宝箱左边箱子的编号,如果不存在则返回-1

输入描述

第一行输入一个数字字串,数字之间使用逗号分隔,例如: 1,2,3,1

  • 1\leq 字串中数字个数 \leq100000

  • -100000\leq每个数字值\leq100000

第二行输入咒语数字,例如: 3

  • 1\leq咒语数字\leq100000

输出描述

存在这样的一对宝箱,请返回最先找到的那对宝箱左边箱子的编号,如果不存在则返回-1

样例

输入

6,3,1,6
3

输出

1

说明

输入

5,6,7,5,6,7
2

输出

0

说明

Java算法源码

import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Scanner;
 
public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
 
    int[] boxes = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();
    int len = Integer.parseInt(sc.nextLine());
 
    System.out.println(getResult(boxes, len));
  }
 
  public static int getResult(int[] boxes, int len) {
    // 统计该数字上一个箱子的编号
    HashMap lastIdx = new HashMap<>();
    // 对应数字的箱子已经找到了,符合咒语要求的箱子对
    HashSet find = new HashSet<>();
 
    int ans = -1;
 
    for (int i = 0; i < boxes.length; i++) {
      // 箱子上贴的数字
      int num = boxes[i];
 
      // 该数字是否已经找到符合咒语要求的箱子对,如果找到了,则不需要再看后面的,只找第一对即可
      if (find.contains(num)) continue;
 
      // 检查箱子对是否符合咒语要求
      if (lastIdx.containsKey(num) && i - lastIdx.get(num) <= len) {
        find.add(num);
        ans = ans == -1 ? lastIdx.get(num) : Math.min(ans, lastIdx.get(num));
      } else {
        lastIdx.put(num, i);
      }
    }
 
    return ans;
  }
}

JS算法源码

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");
 
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});
 
const lines = [];
rl.on("line", (line) => {
  lines.push(line);
 
  if (lines.length == 2) {
    const boxes = lines[0].split(",").map(Number);
    const len = parseInt(lines[1]);
 
    console.log(getResult(boxes, len));
 
    lines.length = 0;
  }
});
 
function getResult(boxes, len) {
  // 统计该数字上一个箱子的编号
  const lastIdx = {};
  // 对应数字的箱子已经找到了,符合咒语要求的箱子对
  const find = new Set();
 
  let ans = -1;
 
  for (let i = 0; i < boxes.length; i++) {
    // 箱子上贴的数字
    const num = boxes[i];
 
    // 该数字是否已经找到符合咒语要求的箱子对,如果找到了,则不需要再看后面的,只找第一对即可
    if (find.has(num)) continue;
 
    // 检查箱子对是否符合咒语要求
    if (lastIdx[num] !== undefined && i - lastIdx[num] <= len) {
      find.add(num);
      ans = ans == -1 ? lastIdx[num] : Math.min(ans, lastIdx[num]);
    } else {
      lastIdx[num] = i;
    }
  }
 
  return ans;
}

Python算法源码

# 输入获取
boxes = list(map(int, input().split(",")))
length = int(input())
 
 
# 算法入口
def getResult():
    # 统计该数字上一个箱子的编号
    lastIdx = {}
    # 对应数字的箱子已经找到了,符合咒语要求的箱子对
    find = set()
 
    ans = -1
 
    for i in range(len(boxes)):
        # 箱子上贴的数字
        num = boxes[i]
 
        # 该数字是否已经找到符合咒语要求的箱子对,如果找到了,则不需要再看后面的,只找第一对即可
        if num in find:
            continue
 
        # 检查箱子对是否符合咒语要求
        if lastIdx.get(num) is not None and i - lastIdx[num] <= length:
            find.add(num)
            ans = lastIdx[num] if ans == -1 else min(ans, lastIdx[num])
        else:
            lastIdx[num] = i
 
    return ans
 
 
# 算法调用
print(getResult())

你可能感兴趣的:(2023秋招,华为od,java,算法,javascript,c++)