【算法面试题】-03

文章介绍了在给定数字序列中寻找特定条件(左右和相等)的黄金宝箱问题,以及模拟分词、计算单行道汽车通行时间、手机App防沉迷系统管理和5G网络中的圈数查找算法。同时,还涉及了一个计算车辆表面读数实际成本的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

阿里巴巴找黄金宝箱(I)

在这里插入图片描述
在这里插入图片描述

import sys

# 输入
input = sys.stdin.readline().strip()
nums = list(map(int, input.split(',')))
n = len(nums)

# 初始化左右两部分的和
left_sum = 0
right_sum = sum(nums)

# 遍历每个箱子,判断是否为黄金宝箱
flag = False  # 是否找到黄金宝箱的标志
for i in range(n):
    if i != 0:  # 左部分的和不包括第一个数字
        left_sum += nums[i - 1]
    right_sum -= nums[i]  # 右部分的和不包括当前数字
    if left_sum == right_sum:  # 判断是否为黄金宝箱
        print(i)  # 输出黄金宝箱的编号
        flag = True  # 找到了黄金宝箱
        break  # 直接退出循环

# 输出结果
if not flag:  # 如果没有找到黄金宝箱
    print(-1)  # 输出-1


在这里插入图片描述

中文分词模拟器

在这里插入图片描述
在这里插入图片描述

def word_segmentation(s, dictionary):
    n = len(s)
    dp = [False] * (n + 1)
    dp[0] = True
    result = []

    for i in range(1, n + 1):
        for j in range(i - 1, -1, -1):
            if dp[j] and s[j:i] in dictionary:
                dp[i] = True
                break

    if not dp[n]:
        return [s[i] for i in range(n)]

    i = n
    while i > 0:
        for j in range(i - 1, -1, -1):
            if dp[j] and s[j:i] in dictionary:
                result.insert(0, s[j:i])
                i = j
                break

    return result


if __name__ == "__main__":
    input_string = input().strip()
    dictionary = input().strip().split(',')

    result = word_segmentation(input_string, dictionary)
    print(','.join(result))

在这里插入图片描述

单行道汽车通行时间

在这里插入图片描述
在这里插入图片描述

def solution_01():
    M_N = input().split(" ")
    M = int(M_N[0])
    N = int(M_N[1])

    s_list = []
    for i in range(M):
        s_list.append(int(input()))

    t_list = [N * 1.0 / s_list[0] + 0.0]
    for i in range(1, M):
        tmp = N * 1.0 / s_list[i] + i
        t = max(tmp, t_list[i - 1])
        t_list.append(t)

    print(t_list[M - 1] - M + 1)


if __name__ == '__main__':
    solution_01()

在这里插入图片描述

手机App防沉迷系统

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


class App:
    def __init__(self, name, p, start, end):
        self.name = name  # 应用名称
        self.p = p  # 优先级
        self.start = start  # 开始时间
        self.end = end  # 结束时间

def trans_to(data):
    arr = data.split(":")
    hour = int(arr[0])  # 小时部分
    minute = int(arr[1])  # 分钟部分
    return hour * 60 + minute  # 将时间转换为分钟表示

def trans_to_app(s):
    arr = s.split(" ")
    name = arr[0]  # 应用名称
    p = int(arr[1])  # 优先级
    start = trans_to(arr[2])  # 开始时间
    end = trans_to(arr[3])  # 结束时间
    return App(name, p, start, end)

n = int(input())  # 输入应用的数量
apps = []

# 读取每个应用的信息
for i in range(n):
    s = input()
    temp = trans_to_app(s)
    
    # 如果开始时间晚于结束时间,忽略该应用
    if temp.start > temp.end:
        continue
    
    apps.append(temp)

res = []

# 遍历每个应用
for i in range(len(apps)):
    ids = []
    
    # 找到与当前应用时间段有重叠的应用
    for j in range(len(res)):
        if res[j].start <= apps[i].end and apps[i].start <= res[j].end:
            ids.append(j)
    
    mx = -1
    
    # 找到重叠应用中优先级最高的
    for j in ids:
        mx = max(mx, res[j].p)
    
    # 如果当前应用优先级更高,则移除重叠应用,添加当前应用
    if mx < apps[i].p:
        for j in reversed(ids):
            res.pop(j)
        res.append(apps[i])

time = trans_to(input())  # 输入时间
ans = "NA"

# 查找当前时间所在的应用
for app in res:
    if app.start <= time and time <= app.end:
        ans = app.name
        break

print(ans)  # 输出结果

在这里插入图片描述

5G 网络建设

在这里插入图片描述
在这里插入图片描述

class Solution:
    def findCircleNum(self, isConnected: List[List[int]]) -> int:
        cities = len(isConnected)
        visited = set()
        provinces = 0
        
        for i in range(cities):
            if i not in visited:
                Q = collections.deque([i])
                while Q:
                    j = Q.popleft()
                    visited.add(j)
                    for k in range(cities):
                        if isConnected[j][k] == 1 and k not in visited:
                            Q.append(k)
                provinces += 1
        
        return provinces

在这里插入图片描述

靠谱的车

在这里插入图片描述
在这里插入图片描述

def calculate_actual_cost(surface_reading):
    actual_cost = 0
    surface_reading_str = str(surface_reading)

    for i in range(len(surface_reading_str)):
        digit = int(surface_reading_str[i])

        if digit == 4:
            # 跳过数字 4
            continue
        elif digit > 4:
            # 对大于 4 的数字减一
            digit -= 1

        # 计算当前位数对应的实际费用,并累加到总费用中
        actual_cost += digit * (9 ** (len(surface_reading_str) - i - 1))

    return actual_cost


# 输入获取
surface_reading = int(input())

# 计算实际产生的费用并输出结果
print(calculate_actual_cost(surface_reading))

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值