笔试题(十):整数数组处理及求质因子

文章包含多个编程算法题目,包括从右向左读取整数并移除重复数字、合并排序数组、求两数之和绝对值最小、输出整数的所有质因子以及计算连续子数组和为特定值的个数。此外,还有一个关于在有限资金内购买三件商品以最大化花费的问题。
摘要由CSDN通过智能技术生成
# 输入一个 int 型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。
# 保证输入的整数最后一位不是 0 。
# 数据范围:1≤n≤10^8
# 输入描述:
# 输入一个int型整数
# 输出描述:
# 按照从右向左的阅读顺序,返回一个不含重复数字的新的整数
def func(num):
    while num % 10 == 0:  # 若整数最后一位是0
        num = int(num / 10)
    num_str_list = list(str(num))[::-1]
    if len(num_str_list) < 2:
        return int(num_str_list[0])
    new_list = [num_str_list[0]]
    for i in range(1, len(num_str_list)):
        if num_str_list[i] in new_list:
            continue
        new_list.append(num_str_list[i])
    new_num = int("".join(new_list))
    return new_num


# 将两个整型数组按照升序合并,并且过滤掉重复数组元素。
# 输出时相邻两数之间没有空格。
# 输入描述:
# 输入说明,按下列顺序输入:
# 1 输入第一个数组的个数
# 2 输入第一个数组的数值
# 3 输入第二个数组的个数
# 4 输入第二个数组的数值
# 输出描述:
# 输出合并之后的数组
def merge(a, b):
    c = a + b
    c.sort()
    d = []
    for i in range(len(c)):
        if c[i] not in d:
            d.append(c[i])
    return "".join(map(str, d))


# 【两数之和绝对值最小】:
# 给定一个从小到大的有序整数序列(存在正整数和负整数)数组 nums,请你在该数组中找出两个数,其和的绝对值(|nums[x]+nums[y]|)为最小值,并返回这个绝对值。
# 每种输入只会对一个答案。但是,数组中同一个元素不能使用两遍。
# 输入描述:
# 一个通过空格分割的有序整数序列字符串,最多1000个整数,且整数数值范围是-65535~65535。
# 输出描述:
# 两数之和绝对值最小值。
def min_abs(string):
    # 方法一:遍历
    nums = string.split()
    nums2 = list(map(int, nums))
    if len(nums) <= 2:
        return abs(sum(nums2))
    nums2_pri = []
    nums2_neg = []
    for i in nums2:
        if i > 0:
            nums2_pri.append(i)
        else:
            nums2_neg.append(i)
    if len(nums2_neg) > 0 and len(nums2_pri) > 0:
        min_num = abs(int(nums[0]) + int(nums[1]))
        for i in range(len(nums) - 1):
            for j in range(i + 1, len(nums)):
                if abs(int(nums[i]) + int(nums[j])) < min_num:
                    min_num = abs(int(nums[i]) + int(nums[j]))
        return min_num
    elif len(nums2_neg) > 0:
        tmp = max(nums2_neg)
        nums2_neg.remove(tmp)
        return abs(tmp + max(nums2_neg))
    elif len(nums2_pri) > 0:
        tmp = min(nums2_pri)
        nums2_pri.remove(tmp)
        return abs(tmp + min(nums2_pri))


# 功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 )
# 数据范围:1≤n≤2×10^9+14
# 输入描述:
# 输入一个整数
# 输出描述:
# 按照从小到大的顺序输出它的所有质数的因子,以空格隔开。
import math


def prime_factor(num):
    prime_num = list(range(2, int(math.sqrt(num)) + 1))
    prime_list = []
    num1 = num
    i = 0
    while i < len(prime_num):
        if num1 % prime_num[i] == 0:
            prime_list.append(prime_num[i])
            num1 = int(num1 / prime_num[i])
            i = 0
        else:
            i += 1
    if len(prime_list) > 0:
        return prime_list
    else:
        return num


# 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 。
def sumk(nums, k):
    cnt = 0
    sum1 = 0
    i = 0
    left = 0
    while i < len(nums):
        sum1 += nums[i]
        if sum1 == k:
            left += 1
            cnt += 1
            i = left
            sum1 = 0
        elif sum1 > k:
            left += 1
            i = left
            sum1 = 0
        else:
            i += 1
    return cnt


# 双十一众多商品进行打折销售,小明想购买自己心仪的一些物品, 但由于购买资金限制,所以他决定从众多心仪商品中购买三件,而且想尽可能得花完资金。
# 现在请你设计一个程序,计算小明尽可能花费的最大资金数。
# 输入描述:
# 输入第一行为一维整型数组m,数组长度小于100,数组元素记录单个商品的价格。单个商品价格小于1000。
# 输入第二行为购买资金的额度r,r<100000。
# 输入格式正确无需考虑输入错误情况
# 输出描述:
# 输出为满足上述条件的最大花费额度
# 注意:如果不存在满足上述条件的商品请返回-1
def max_buy(nums, k):
    nums2 = sorted(nums)
    if sum(nums2[:3]) > k:
        return -1
    rslt = []
    for i in range(len(nums2)):
        tmp1 = nums2[i]
        for j in range(i + 1, len(nums2)):
            tmp2 = nums2[j]
            for l in range(j + 1, len(nums2)):
                sum1 = tmp1 + tmp2 + nums2[l]
                if sum1 == k:
                    return sum1
                if sum1 < k:
                    rslt.append(sum1)
                break
    if len(rslt) < 1:
        return -1
    return max(rslt)


if __name__ == '__main__':
    print("第一题:")
    num = 9876673
    print(func(num))

    print("第二题:")
    a = [1, 2, 5]
    b = [-1, 0, 3, 2]
    print(merge(a, b))

    print("第三题:")
    string3 = "-3 -1 5 7 11 15"
    print(min_abs(string3))

    print("第四题:")
    num2 = 180
    print(prime_factor(num2))

    print("第五题:")
    nums = [1, 1, 1]
    nums2 = [1, 2, 3]
    print(sumk(nums, 2))
    print(sumk(nums2, 3))

    print("第六题:")
    nums = [23, 26, 36, 27]
    k = 78
    print(max_buy(nums, k))
    nums2 = [23, 30, 40]
    k2 = 26
    print(max_buy(nums2, k2))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Trisyp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值