算法练习- 其他算法练习5

宜居星球改造计划

  • yes no na 每个值为一个格子;
  • 每天yes的值可以向上下左右扩展一个格子,将no改为yes;
  • 矩形区域no是否可以全部转为yes,可以的话需要几天?不可以的话输出-1
  • 输入:
    yes yes no
    no no no
    yes no no
    在这里插入图片描述
    思路:
  • xxx

python:


data = []
while True:
    s = input().strip().split()
    if s:
        data.append(s)
    else:
        break
# 四个方向
direct = [(-1, 0), (1, 0), (0, 1), (0, -1), (0, 0)]

total_days = 0
# 改造
result = start_improve(data)

找最小数

pass

查字典

  • 输入一个单词前缀、字典长度、字典数组;
  • 字典数组已经排序;
  • 输出包含该单词前缀的所有单词;每个单词占一行;

示例
输入:
abc 3 a ab abc abcd
输出:
abc
abcd

思路:

  • 二分查找

python:


def find_str(prefix, n, dict_arr):
    global flag
    if n == 0:
        return
    if n == 1:
        if dict_arr[0].startswith(prefix):
            flag = True
            print(dict_arr[0])
        return
    mid = n // 2  # 二分
    left_arr = dict_arr[:mid]
    right_arr = dict_arr[mid:]
    find_str(prefix, len(left_arr), left_arr)
    find_str(prefix, len(right_arr), right_arr)


if __name__ == '__main__':
    s = input().strip().split()
    prefix = s[0]
    n = int(s[1])
    dict_arr = s[2:]
    flag = False  # 表示未找到

    # 未找到则不会输出
    find_str(prefix, n, dict_arr)

    # 一直未找到  flag保持为False
    if not flag:
        print(-1)

两个整数数组中同时出现的整数

  • 有同时出现的整数,按照同时出现次数(取两次数的最小值)归类;
  • 按照次数,从小到大按行输出;
  • 两数组没有同时出现的整数时,输出NULL;

输入:
第一行,一个整数数组;
第二行,一个整数数组;

输出:
同时出现次数从小到大按行输出,格式为 次数:该次数下的整数(升序排序)

示例1
输入:
5,3,6,-8,0,11
2,8,8,8,-1,15
输出:
NULL

示例2
输入:
5,8,11,3,6,8,8,-1,11,2,11,11
11,2,11,8,6,8,8,-1,8,15,3,-9,11
输出:
1:-1,2,3,6
3:8,11

思路

  • 交集求同时出现的整数;
  • 统计每个同时出现的整数,在两个数组中同时出现的最少次数;
  • 字典存储,次数为key,出现对应次数的整数列表为val

python:


if __name__ == '__main__':
    arr1 = list(map(int, input().strip().split(",")))
    arr2 = list(map(int, input().strip().split(",")))
    arr1_set = set(arr1)
    arr2_set = set(arr2)
    common_set = arr1_set & arr2_set
    if not common_set:
        print("NULL")
    else:
        # 有共同整数
        statistic_times = {
    
    }
        for i in common_set:
            t1 = arr1.count(i)
            t2 = arr2.count(i)
            t = min(t1, t2)
            if t in statistic_times:
                statistic_times[t].append(i)
            else:
                statistic_times[t] = [i]

        result = sorted(statistic_times.items(), key=lambda i:i[0])
        for tu in result:
            int_list = tu[1]
            int_list.sort()
            int_list_str = map(str, int_list)
            print(f"{
      
      tu[0]}:", ",".join(int_list_str))

分积木

  • 有一堆积木,每个积木都有自己的重量;
  • A、B两人想分配两堆且重量相等;
  • A 计算求和时,将数值转为二进制,求和时不进位,如25(11001)+11(01011)= 18(10010)
  • B满足A的要求下(二进制计算且不进位时,两堆重量相等),如何让自己获取的重量最大。(B按正常数值计算且正常进位)

示例1
输入:
3
3 5 6
输出:
11

示例2
输入:
5
4 5 3 2 8
输出:
-1

思路:

  • 所有值进行异或,结果为0才可以平分;
  • 将重量数组按照顺序进行二分;
  • A 进行(整数值)异或计算,两边相等时,B可以取两堆中的最大重量的积木;

python:


def calc_as_a(arr):
    if len(arr) == 1:
        return arr[0]
    result = arr[0]
    for i in range(1, len(arr)):
        result ^= arr[i]

    return result


if __name__ == '__main__':
    # 积木数量
    m = int(input().strip())
    weights_arr = list(map(int, input().strip().split()))

    result = -1
    for i in range(1, m):
        left = weights_arr[:i]
        right = weights_arr[i:]
        # 满足A的条件
        if calc_as_a(left) == calc_as_a(right):
            result = max(result, sum(left), sum(right))
    # 满足A的情况下,B获取的最大重量
    print(result)

猜你喜欢

转载自blog.csdn.net/weixin_45228198/article/details/132462907