百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

LeetCode 007:整数反转 (Python)(整数反转js)

off999 2024-09-27 13:52 26 浏览 0 评论

一、写在前面

之前写过的Leetcode笔记:https://blog.csdn.net/qq_39241986/article/category/9279876今天给大家分享的是LeetCode 007:整数反转,为面试而生,期待你的加入。

二、今日题目

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。说明:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [?231, 231 ? 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

示例:

输入: 123
输出: 321
输入: -123
输出: -321
输入: 120
输出: 21

三、 分析

这个题目看着不怎么难,因为业务逻辑很简单:把一个整数逆置,题目给了数据范围,给了特殊案例,基本思路如下:拿到输入的数据,判断是否为负数,想办法把数据从个位开始与高位互换位置,判断互换位置后的数据是否溢出。

四、解题

  • 方法一:int转变为str,然后遍历字符串(Python里int是不可迭代的,所以得转换一下),将原先的高位变成低位。
# -*- coding: utf-8 -*-
"""
@author = 老表
@date = 2019-08-29
@个人公众号 : 简说Python
"""
class Solution:
 def reverse(self, x: int) -> int:
 y = 0 # 返回结果
 j = 0 # 幂指数(位权重)
 flag = 0 # 正负标志位
 if x < 0: # 处理负数情况
 flag = 1
 x = x * (-1)
 for i in str(x): # 转变成字符串进行遍历
 # 进行组装,以前的高位变成低位
 y = y + int(i)*pow(10, j)
 j = j + 1
 if y > pow(2, 31)-1: # 处理溢出情况
 return 0 
 if flag == 1: # 处理负数情况
 y = -1 * y
 return y

执行结果:

修改一下对负数和幂指数的处理方法,效果会好一点点,但本质上都是O(n)时间复杂度(n为x的位数):

# -*- coding: utf-8 -*-
"""
@author = 老表
@date = 2019-08-29
@个人公众号 : 简说Python
"""
class Solution:
 def reverse(self, x: int) -> int:
 y = 0 
 j = 0 
 flag = 0 
 for i in str(x): 
 if i == "-":
 flag = 1
 continue
 y = y + int(i)*10**j
 j = j + 1
 if y > 2147483647: 
 return 0
 if flag == 1: 
 y = -y
 return y
  • 方法二:
# -*- coding: utf-8 -*-
"""
@author = 老表
@date = 2019-08-26
@个人公众号 : 简说Python
"""
class Solution:
 def reverse(self, x: int) -> int:
 y = 0 # 返回结果
 flag = 0 # 正负标志位
 if x < 0: # 如果为负,先化为正数
 x = -x
 flag =1
 while x != 0: # 循环拆解
 pop = x % 10 # 取出低位
 x = x // 10 # 取出剩余
 y = y * 10 + pop # 连接重组数据,低位变高位
 if y > 2147483647: # 判断是否溢出
 return 0
 if flag == 1: # 处理负数情况
 return -y
 return y
  • 提交结果
  • 效果依然不理想,对代码稍加改动:
class Solution:
 def reverse(self, x: int) -> int:
 y = 0 # 结果
 while x != 0: # 遍历拆分
 pop = x % 10 # 取出低位
 x = x // 10 # 取出剩余数
 if x < 0 and pop != 0: # 如果为负数另做处理
 pop = pop - 10
 x = x + 1
 y = y * 10 + pop # 重新组装,低位变成高位
 if y < -2147483648: # 判断溢出
 return 0
 if y > 2147483647: # 判断溢出
 return 0
 return y

好一点点?!看不怎么出来,确实,从时间复杂度来说还是差不多的,后面的改动需要注意的是对负数的处理:

# 在Python里负数的除法和正数是相反的,取余数会向10靠近,取商会向-∞靠近
例如:
-12 % 10
结果:8
-123 // 10
结果:-13
然而对于本题来说,
-12?10取余,我们想得到的是-2,
-123?10取商,我们想得到的是-12
很简单
pop = pop - 10 # 取余后减10
x = x + 1 # 取商后加1

五、疑惑

我今天发现,在Leetcode 上可以看top级的解题方法了,虽然只有代码,也很有参考学习价值。方法:

提交自己的答案后,会有一个运行时间分布图,点击上面的黄色柱状条即可查看对应运行时间实现的代码了。

top1的解法:感觉?看起来?确实高级,先转为str,然后用了内置的字符串函数startswith(判断正负),然后用到了切片,嗯~原来这样速度比较快~

top2解法:和top1差不多,不同点在于,转换为字符串后,用内置的字符串处理函数rstrip处理了数据,(删除右边的“-”),然后是正负判断。

top3解法:用到的挺多的,正则,abs(取绝对值函数),join(列表链接成字符串函数),reverse(字符串逆置函数),Python里的三目表达式(a if A else b 其中A是个判断表达式),数据转换(int,str)。

# Python里的三目表达式 
# 很棒的一种判断语句书写方法,让代码看起来比较简洁,给大家举个例子
语言描述: 
形式 : 变量1 = 结果A if 判断表达式1 else 结果B
如果判断表达式1为True ,则变量1 = 结果A 否则 变量1 = 结果B
a = 1 if 3 > 4 else 0
结果 : 0

top4解法:Python里的三目表达式(a if A else b 其中A是个判断表达式),列表推导式,遍历循环~

其实看过这些top级解法后,我发现,核心思想和我是一样的,只是在实现某个逻辑功能是方法不同,所以这是我要学习的地方,当然Leetcode上还有很多其他解法,欢迎大家去看看,思考出属于自己的代码。

六、结语

没力气了,健身去了,坚持就完了。希望对你有所帮助

相关推荐

Linux 网络协议栈_linux网络协议栈

前言;更多学习资料(包含视频、技术学习路线图谱、文档等)后台私信《资料》免费领取技术点包含了C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,Z...

揭秘 BPF map 前生今世_bpfdm

1.前言众所周知,map可用于内核BPF程序和用户应用程序之间实现双向的数据交换,为BPF技术中的重要基础数据结构。在BPF程序中可以通过声明structbpf_map_def...

教你简单 提取fmpeg 视频,音频,字幕 方法

ffmpeg提取视频,音频,字幕方法(HowtoExtractVideo,Audio,SubtitlefromOriginalVideo?)1.提取视频(ExtractVi...

Linux内核原理到代码详解《内核视频教程》

Linux内核原理-进程入门进程进程不仅仅是一段可执行程序的代码,通常进程还包括其他资源,比如打开的文件,挂起的信号,内核内部的数据结构,处理器状态,内存地址空间,或多个执行线程,存放全局变量的数据段...

Linux C Socket UDP编程详解及实例分享

1、UDP网络编程主要流程UDP协议的程序设计框架,客户端和服务器之间的差别在于服务器必须使用bind()函数来绑定侦听的本地UDP端口,而客户端则可以不进行绑定,直接发送到服务器地址的某个端口地址。...

libevent源码分析之bufferevent使用详解

libevent的bufferevent在event的基础上自己维护了一个buffer,这样的话,就不需要再自己管理一个buffer了。先看看structbufferevent这个结构体struct...

一次解决Linux内核内存泄漏实战全过程

什么是内存泄漏:程序向系统申请内存,使用完不需要之后,不释放内存还给系统回收,造成申请的内存被浪费.发现系统中内存使用量随着时间的流逝,消耗的越来越多,例如下图所示:接下来的排查思路是:1.监控系统中...

彻底搞清楚内存泄漏的原因,如何避免内存泄漏,如何定位内存泄漏

作为C/C++开发人员,内存泄漏是最容易遇到的问题之一,这是由C/C++语言的特性引起的。C/C++语言与其他语言不同,需要开发者去申请和释放内存,即需要开发者去管理内存,如果内存使用不当,就容易造成...

linux网络编程常见API详解_linux网络编程视频教程

Linux网络编程API函数初步剖析今天我们来分析一下前几篇博文中提到的网络编程中几个核心的API,探究一下当我们调用每个API时,内核中具体做了哪些准备和初始化工作。1、socket(family...

Linux下C++访问web—使用libcurl库调用http接口发送解析json数据

一、背景这两天由于一些原因研究了研究如何在客户端C++代码中调用web服务端接口,需要访问url,并传入json数据,拿到返回值,并解析。 现在的情形是远程服务端的接口参数和返回类型都是json的字符...

平衡感知调节:“系统如人” 视角下的架构设计与业务稳定之道

在今天这个到处都是数字化的时代,系统可不是一堆冷冰冰的代码。它就像一个活生生的“数字人”,没了它,业务根本转不起来。总说“技术要为业务服务”,但实际操作起来问题不少:系统怎么才能快速响应业务需求?...

谈谈分布式文件系统下的本地缓存_什么是分布式文件存储

在分布式文件系统中,为了提高系统的性能,常常会引入不同类型的缓存存储系统(算法优化所带来的的效果可能远远不如缓存带来的优化效果)。在软件中缓存存储系统一般可分为了两类:一、分布式缓存,例如:Memca...

进程间通信之信号量semaphore--linux内核剖析

什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠...

Qt编写推流程序/支持webrtc265/从此不用再转码/打开新世界的大门

一、前言在推流领域,尤其是监控行业,现在主流设备基本上都是265格式的视频流,想要在网页上直接显示监控流,之前的方案是,要么转成hls,要么魔改支持265格式的flv,要么265转成264,如果要追求...

30 分钟搞定 SpringBoot 视频推拉流!实战避坑指南

30分钟搞定SpringBoot视频推拉流!实战避坑指南在音视频开发领域,SpringBoot凭借其快速开发特性,成为很多开发者实现视频推拉流功能的首选框架。但实际开发中,从环境搭建到流处理优...

取消回复欢迎 发表评论: