记录一次耗时比较久的2种方法

待分析:内存与复杂度问题:
有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
第一种解法:#在成为领导者之前,成功的全部就是自我成长#有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。#1.2.3.4.5,6 |1,2,4,5|1,2,5|1,5#1,2,3,4,5#1,2,3,4#解决思路提供了三种情况的遍历,采用了递归的方式,但不得不说增加了很多额外变量的开销def one_px(lst):    length=len(lst)    if(length%3==0):        newlst = queue_n(lst)    elif (length%3==1):        newlst = queue_n1(lst)    else:        newlst = queue_n2(lst)    if len(newlst)>=3:        one_px(newlst) #递归    else:        print(newlst)    return newlst

def queue_n(lst):    l=len(lst)    for i in range(l,-1,-1):        if (i+1)%3==0:            lst.remove(lst[i])    print(‘n‘)    print(lst)    return lst

def queue_n2(lst):    l=len(lst)    for i in range(l-2,-1,-1):        if (i + 1) % 3 == 0:            lst.remove(lst[i])    l = len(lst)    temp1 = lst[l - 2]    temp2 = lst[l-1]    print(lst)    for i in range(l-3,-1,-1):        lst[i+2]=lst[i]    lst[0]=temp1    lst[1]=temp2    print(‘n2‘)    print(lst)    return lst

def queue_n1(lst):    l=len(lst)    for i in range(l,-1,-1):        if (i + 1) % 3 == 0:            lst.remove(lst[i])    print(lst)    l=len(lst)    temp=lst[l-1]    for i in range(l-2,-1,-1):        lst[i+1]=lst[i]    lst[0]=temp    print(‘n1‘)    print(lst)    return lst
if __name__==‘__main__‘:
  lst=[]  #lst=[1,2,3,4,5,6,7,8,9,10]  for i in range(1,35):      lst.append(i)  print(lst)  #while len(lst)>2:  print(one_px(lst)[1])
运行结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34]
[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34]
n1
[34, 1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32]
[34, 1, 4, 5, 8, 10, 13, 14, 17, 19, 22, 23, 26, 28, 31, 32]
n2
[31, 32, 34, 1, 4, 5, 8, 10, 13, 14, 17, 19, 22, 23, 26, 28]
[31, 32, 1, 4, 8, 10, 14, 17, 22, 23, 28]
n1
[28, 31, 32, 1, 4, 8, 10, 14, 17, 22, 23]
[28, 31, 1, 4, 10, 14, 22, 23]
n2
[22, 23, 28, 31, 1, 4, 10, 14]
[22, 23, 31, 1, 10, 14]
n2
[10, 14, 22, 23, 31, 1]
n
[10, 14, 23, 31]
[10, 14, 31]
n1
[31, 10, 14]
n
[31, 10]
[31, 10]
10

第二种解法:
#在成为领导者之前,成功的全部就是自我成长#有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

if __name__==‘__main__‘:

    n=10    lst=[]    for i in range(n):        lst.append(i+1)    print(lst)    i=0    k=0    m=0while(m<n-1):    if(lst[i]!=0):k+=1    if(k==3):        lst[i]=0        k=0        m+=1    i+=1    #print(i)    if(i==n):i=0    print(lst)运行结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 0, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 0, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 0, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 0, 4, 5, 0, 7, 8, 9, 10]
[1, 2, 0, 4, 5, 0, 7, 8, 9, 10]
[1, 2, 0, 4, 5, 0, 7, 8, 9, 10]
[1, 2, 0, 4, 5, 0, 7, 8, 0, 10]
[1, 2, 0, 4, 5, 0, 7, 8, 0, 10]
[1, 2, 0, 4, 5, 0, 7, 8, 0, 10]
[1, 0, 0, 4, 5, 0, 7, 8, 0, 10]
[1, 0, 0, 4, 5, 0, 7, 8, 0, 10]
[1, 0, 0, 4, 5, 0, 7, 8, 0, 10]
[1, 0, 0, 4, 5, 0, 7, 8, 0, 10]
[1, 0, 0, 4, 5, 0, 7, 8, 0, 10]
[1, 0, 0, 4, 5, 0, 0, 8, 0, 10]
[1, 0, 0, 4, 5, 0, 0, 8, 0, 10]
[1, 0, 0, 4, 5, 0, 0, 8, 0, 10]
[1, 0, 0, 4, 5, 0, 0, 8, 0, 10]
[0, 0, 0, 4, 5, 0, 0, 8, 0, 10]
[0, 0, 0, 4, 5, 0, 0, 8, 0, 10]
[0, 0, 0, 4, 5, 0, 0, 8, 0, 10]
[0, 0, 0, 4, 5, 0, 0, 8, 0, 10]
[0, 0, 0, 4, 5, 0, 0, 8, 0, 10]
[0, 0, 0, 4, 5, 0, 0, 8, 0, 10]
[0, 0, 0, 4, 5, 0, 0, 8, 0, 10]
[0, 0, 0, 4, 5, 0, 0, 0, 0, 10]
[0, 0, 0, 4, 5, 0, 0, 0, 0, 10]
[0, 0, 0, 4, 5, 0, 0, 0, 0, 10]
[0, 0, 0, 4, 5, 0, 0, 0, 0, 10]
[0, 0, 0, 4, 5, 0, 0, 0, 0, 10]
[0, 0, 0, 4, 5, 0, 0, 0, 0, 10]
[0, 0, 0, 4, 5, 0, 0, 0, 0, 10]
[0, 0, 0, 4, 0, 0, 0, 0, 0, 10]
[0, 0, 0, 4, 0, 0, 0, 0, 0, 10]
[0, 0, 0, 4, 0, 0, 0, 0, 0, 10]
[0, 0, 0, 4, 0, 0, 0, 0, 0, 10]
[0, 0, 0, 4, 0, 0, 0, 0, 0, 10]
[0, 0, 0, 4, 0, 0, 0, 0, 0, 10]
[0, 0, 0, 4, 0, 0, 0, 0, 0, 10]
[0, 0, 0, 4, 0, 0, 0, 0, 0, 10]
[0, 0, 0, 4, 0, 0, 0, 0, 0, 10]
[0, 0, 0, 4, 0, 0, 0, 0, 0, 10]
[0, 0, 0, 4, 0, 0, 0, 0, 0, 10]
[0, 0, 0, 4, 0, 0, 0, 0, 0, 10]
[0, 0, 0, 4, 0, 0, 0, 0, 0, 10]
[0, 0, 0, 4, 0, 0, 0, 0, 0, 10]
[0, 0, 0, 4, 0, 0, 0, 0, 0, 10]
[0, 0, 0, 4, 0, 0, 0, 0, 0, 0]




原文地址:https://www.cnblogs.com/wenwen9090/p/12261898.html

时间: 2024-07-30 05:04:45

记录一次耗时比较久的2种方法的相关文章

[BUUOJ记录] [强网杯 2019]随便注(三种方法)

本题主要考察堆叠注入,算是比较经典的一道题,在i春秋GYCTF中也出现了本题的升级版 猜测这里的MySQL语句结构应该是: select * from words where id='$inject'; 构造Payload:用单引号+分号闭合前面的语句,插入SQL语句,再用注释符注释掉后面的语句即可 先列出所有数据库: 1';show databases;# 得到: array(1) { [0]=> string(11) "ctftraining" } array(1) { [0

Android 记录和恢复ListView滚动的位置的三种方法

本文主要介绍记录和恢复listView滚动位置的3种方法(1)记录listView滚动到的位置的坐标(推荐)(2)记录listView显示在屏幕上的第一个item的位置(3)通知适配器数据改变. 有时在view切换时,需要恢复listView之前滚动到的位置,鉴于网上已有资料说的都是第二种方法,而第二种方法本身在精确度上较差,自己找到了第一种方法分享下. 1.记录listView滚动到的位置的坐标,然后利用listView.scrollTo精确的进行恢复 listView.setOnScroll

oracle 查询当天记录 三种方法效率比较

-- 查询一表中当天生成的数据 -- 原表mobilefrends中的cdate字段上有索引,创建索引语句是:create index mobilefrends_cdate_idx on mobilefrends(cdate); --------------------------------------------------------------------------------------------------------------------- -- 方法一:用to_char()

ORACLE查询删除重复记录三种方法

本文列举了3种删除重复记录的方法,分别是rowid.group by和distinct,小伙伴们可以参考一下. 比如现在有一人员表 (表名:peosons) 若想将姓名.身份证号.住址这三个字段完全相同的记录查询出来 代码如下: select p1.*   from persons  p1,persons  p2   where p1.id<>p2.id   and  p1.cardid = p2.cardid and p1.pname = p2.pname and p1.address =

spring+hibernate删除单条记录的几种方法

spring+hibernate删除单条记录的几种方法

Oracle多行记录合并的几种方法

今天正好遇到需要做这个功能,顺手搜了一下网络,把几种方法都列出来,方便以后参考. 1 什么是合并多行字符串(连接字符串)呢,例如: SQL> desc test; Name Type Nullable Default Comments ------- ------------ -------- ------- -------- COUNTRY VARCHAR2(20) Y CITY VARCHAR2(20) Y SQL> select * from test; COUNTRY CITY ---

Sql Server删除数据表中重复记录 三种方法

本文介绍了Sql Server数据库中删除数据表中重复记录的方法. [项目]数据库中users表,包含u_name,u_pwd两个字段,其中u_name存在重复项,现在要实现把重复的项删除![分析]1.生成一张临时表new_users,表结构与users表一样:2.对users表按id做一个循环,每从users表中读出一个条记录,判断new_users中是否存在有相同的u_name,如果没有,则把它插入新表:如果已经有了相同的项,则忽略此条记录:3.把users表改为其它的名称,把new_use

MySql避免重复插入记录的几种方法

本文章来给大家提供三种在mysql中避免重复插入记录方法,主要是讲到了ignore,Replace,ON DUPLICATE KEY UPDATE三种方法,有需要的朋友可以参考一下 方案一:使用ignore关键字 如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用: 复制代码代码如下: INSERT IGNORE INTO `table_name` (`email`, `phone`, `user_id`) VALUES ('[email protec

oracle开发系列(五) 取左表不在右表记录的3种方法-引申到db2

引: 我们在做数据库开发用 pl sql 加工数据时,经常会遇到取a表不在b表中的记录 或者 左表不在右表中的记录 的情况,所以特地对此做个简单的总结,以便以后用到回顾. 解决: 取a表某字段不在b表 我们自然的逻辑会想到用 a not in b ,这是第一种方法 1 not in 如下图 ,数据库为不跑业务的测试数据库,两张表的数据量一样, 用not in 可以找出a表中prd_inst_id不在t表中的记录 如下图,为生产库的表  l 和t表数据量相同,数据量900w左右 2 not exs