当前位置: 首页 > article >正文

算法题:找出1到1亿中“只有一个重复的”自然数

三种解题算法思路:

方式一:先将数组排序,然后判断是否存在相邻的两个数

缺点:数组排序这个操作消耗cpu内存,性能差劲,面试官直接pass的  ||-||

方式二:使用递归折半方式进行查找

缺点:遍历的次数太多,耗时太长

方式三:先求1到1亿之和,只需要遍历一次数组,每次用和减去数组中的值,剩余的值就是多余的自然数

优点:目前想到最好的方式

下面提供几种方式的解题代码:

# coding=utf-8
import time


list0 = [i for i in range(100000000 + 1)]
list0.insert(123456, 78769) # 随机插入一个数据

# 时间统计装饰器
def time_print(f): # 输入是函数,输出也是函数
    def wrapper(*arg):  # 固定参数
        start = time.time()
        ret = f(*arg)
        print(time.time() - start)
        return ret
    return wrapper


@time_print
def fun1(arr):
    '''排序之后,判断相邻数方式'''
    arr.sort()
    for i in range(len(arr) + 1):
        if arr[i] == arr[i + 1]:
            return i
        
print(fun1(list0)) # 5秒多

def fun2(arr, start, mid, end):
    """
    折半遍历,遍历的次数太多,耗时太长
    """
    if mid >= end or mid <= start:
        return mid
    j = 0
    for i in arr:
        if i < mid:
            j += 1
            if j > mid:
                return fun2(arr, start, (start + mid)/2, mid)

    return fun2(arr, mid, (mid + end)/2, end)
    
start = time.time()
print(fun2(list0, 0, len(list0)/2, len(list0)))  # 48秒
print(time.time() - start)

@time_print
def fun2(list1):
    total = (1 + 100000000) * 50000000
    # total = sum(i for i in range(100000000 + 1))  # 耗时太大
    for i in list1:
        total -= i
    return total

print(fun2(list0)) # 3秒多


http://www.kler.cn/a/300525.html

相关文章:

  • JavaScript中提高效率的技巧一
  • Node.js 到底是什么
  • 诡异的Spring @RequestBody驼峰命名字段映射失败为null问题记录
  • Zookeeper 数据迁移实战:基础环境搭建与高效迁移方案全览
  • 【Uniapp-Vue3】@import导入css样式及scss变量用法与static目录
  • 主链和Layer2之间资产转移
  • Flask中的钩子函数
  • SpringCloud之配置中心svn示例和refresh
  • go-mciro系列(四)使用nacos作为配置中心_go使用nacos
  • 【无人机设计与控制】固定翼四旋翼无人机UAV俯仰姿态飞行模糊自整定PID控制Simulink建模
  • 大模型的实践应用29-大语言模型的RLHF(人类反馈强化学习)的具体应用与原理介绍
  • 分布式集群下如何做到唯一序列号
  • rhel 8.6 开箱基本设置
  • Python3网络爬虫开发实战(14)资讯类页面智能解析
  • 【大数据算法】一文掌握大数据算法之:空间亚线性算法。
  • windows和linux安装mysql5.7.31保姆级教程
  • C/C++程序的内存开辟
  • MySQL数据库 — Explain命令
  • hadoop分布式搭建
  • 贪心算法day29|134. 加油站(理解有难度)、135. 分发糖果、860. 柠檬水找零、406. 根据身高重建队列
  • 最佳实践-模板设计模式
  • 横版闯关手游【全明星时空阿拉德】Linux手工服务端+运营后台+双app端
  • git:认识git和基本操作(1)
  • 手写Promise
  • 《实现 HTML 图片轮播效果》
  • <<编码>> 第 5 章 绕过拐弯的通信(Seeing Around Corners) 示例电路