首页 > 编程问答 >Digitwise_addition:超出限制:如果超出 -> 代码超时

Digitwise_addition:超出限制:如果超出 -> 代码超时

时间:2024-08-04 15:01:35浏览次数:15  
标签:python arrays list digits codewarrior

我正在研究 kata。

按位加法是一种特殊的加法,它不是通常向数字加 1,而是向该数字的每个数字加 1。如果数字是 9,我们将其替换为 10,而不保留到下一个数字。

示例

123 -> 234

任务

编写一个接受两个数字 n 和 k 的函数,并在应用数字加法 k 次后输出 n 中的位数。由于答案可能非常大,因此返回答案模 1_000_000_007。

您的解决方案预计为 O(klogn)。

我的解决方案:

import sys
MOD = 10**9 + 7 

sys.set_int_max_str_digits(0)

def d2a(digits):

  arr= list(map(int,str(digits)))
  return arr


def a2d(arr):
  length=len(arr)
  digit=""

  for i in range(length):
    digit+=str(arr[i])
  return int(digit)


def add(n):
  return n+1


def digitwise_addition(digit, K):
  for i in range(K):
    #CONVERTING INTO ARRAY
    arr=d2a(digit)
    #ADDING 1 INTO ALL NUMBERS FROM ARRAY
    arr=list(map(add,arr))
    #CONVERTING ARRAY INTO DIGIT
    digit=a2d(arr)

  arr=d2a(digit)
  return len(arr) %MOD

问题:它通过了所有计算,但是当 K 很大时,它要求超过限制,如果超过,它会说:代码超时


你代码的时间复杂度是 O(k*log(n)),这对于 k 值较大时是不够高效的。这是因为,对于每一次 k 的迭代,你都在本质上迭代了数字 n 中的所有位数。

我们可以通过分析数字加法操作的特点来优化代码:

  1. 循环模式 : 注意到每一位数在连续的数字加法操作下会形成一个循环模式。例如,数字 '3' 会经历 '4' -> '5' -> '6' -> '7' -> '8' -> '9' -> '10' -> '11' -> '2' -> '3' 这样一个循环,循环长度为10。

  2. 独立性 : 每一位数的循环模式是独立的,不受其他位数的影响。

基于以上两点,我们可以采取以下优化策略:

  1. 预计算循环 : 我们可以预先计算出每一位数的循环模式。例如,数字 '3' 的循环模式可以表示为 [4, 5, 6, 7, 8, 9, 1, 0, 1, 2]。

  2. 快速跳跃 : 对于每一次 k 操作,我们可以利用预计算的循环模式直接跳到最终结果,而不需要一步一步地进行加法操作。例如,如果 k 是 13,数字是 '3',那么我们可以直接从预计算的循环模式中找到索引为 13 % 10 = 3 的元素,即 '6'。

优化后的代码:

MOD = 10**9 + 7

def digitwise_addition(n, k):
  cycles = [[(i + j) % 10 for j in range(10)] for i in range(10)]
  new_digits = []
  for digit in str(n):
    digit = int(digit)
    new_digit = cycles[digit][k % 10] 
    new_digits.append(new_digit)
  result = int("".join(map(str, new_digits)))
  return len(str(result)) % MOD

代码解释:

  1. cycles : 这是一个二维数组,存储了每一位数的循环模式。 cycles[i][j] 表示数字 i 经过 j 次数字加法操作后的结果。
  2. new_digits : 存储最终结果的每一位数字。
  3. 对于 n 中的每一位数字,我们使用预计算的循环模式 cycles 直接找到经过 k 次数字加法操作后的结果。
  4. 最后,将 new_digits 转换为整数,并返回其位数模 MOD 的结果。

这个优化后的算法的时间复杂度为 O(log(n)),与 k 无关,能够有效地解决 k 值较大的情况。

标签:python,arrays,list,digits,codewarrior
From: 78830347

相关文章

  • 如何在python中使用xarray打开grib2文件?
    将xarray导入为xr导入cfgrib导入生态码将pandas导入为pddata=xr.open_dataset(r"C:\Users\new\forecast_data.grib2",engine="cfgrib")这是我的代码。我只想使用xarray读取这个文件。错误是:无法识别的引擎cfgrib必须是以下之一:['netcdf4'、'scipy'、'......
  • 如何在 java 或 python 中使用 HTTP(S) 解决无法解析的主机名或无法识别的名称错误?
    我尝试以编程方式访问网站的信息,但在Java和Python上都无法解析主机名。如果我指定IP地址,则会将错误更改为TLSV1_UNRECOGNIZED_NAME。不过,这个网站无需任何额外的工作就可以通过任何浏览器解决。我在这里浏览了很多潜在的解决方案,但对于Python,它说这个问题应该在2.7......
  • Python 请求 POST 请求与 websockets 库一起使用时挂起
    我使用Python中的requests库发送POST请求,同时维护与websockets库的WebSocket连接:importasyncioimportrequestsimportwebsocketsasyncdefwebsocket_handler(uri):asyncwithwebsockets.connect(uri)aswebsocket:whileTrue:me......
  • 在Python中,list1[::] = list2的空间复杂度是多少?
    此代码首先迭代列表nums,更新整数0、1、2(也分别称为红色、白色和蓝色)的计数。nums保证只有整数0、1和/或2。找到计数后,代码使用[::],这是一种就地修改列表的技巧,以排序numsdefsortColors(self,nums:List[int])->None:re......
  • [附开题]flask框架高校资产管理系统d8y3s(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高等教育事业的快速发展,高校资产规模日益庞大,种类繁多,管理难度显著增加。传统的资产管理方式往往依赖于手工记录和纸质档案,不仅效率低......
  • [附开题]flask框架贺州图特产管理系统uuy79(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景贺州,这座历史悠久、文化底蕴深厚的城市,以其丰富的自然资源和独特的地理位置孕育了众多令人瞩目的特产。然而,在信息化快速发展的今天,贺州特......
  • [附开题]flask框架红枫超市会员管理系统ew5iq(源码+论文+python)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着零售行业的快速发展与消费者需求的日益多样化,超市作为人们日常生活中不可或缺的一部分,其管理效率和服务质量直接影响着顾客的购物体验......
  • PYTHON专题-(4)python叫你搞对象
    什么是面向过程编程?面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。什么是面向对象编程?面向对象编程——ObjectOrientedProgramming,简......
  • Python 基础教学:中文编码处理
    《Python基础教学:中文编码处理》在编程中,处理中文字符时经常会遇到编码问题。Python3默认使用UTF-8编码,但在处理文件、网络数据或与旧系统交互时,可能需要处理GBK、GB2312等其他编码。1.字符串的编码和解码在Python中,字符串(str)默认是Unicode编码。当你需要将......
  • Python 基础教学:深入了解 continue、break 和 pass 语句
    《Python基础教学:深入了解continue、break和pass语句》Python中的控制流语句不仅仅包括条件语句和循环,还包括continue、break和pass这三个特殊的关键字,它们在特定情况下可以控制程序的流程。1.continue语句continue用于跳过当前循环的剩余代码,在循环控制结......