1、两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
class Solution(object):
def twoSum(self, nums, target):
for i in range (len(nums)):
for j in range(i+1,len(nums)):
if nums[i]+nums[j]==target :
return i,j #int类型的i和j直接返回后就是题目要求的[int,int]结果
2、整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 :
输入: -123
输出: -321
其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0
class Solution(object):
def reverse(self, x):
list1=[]
flag=0
str1=str(x)
for i in range(len(str1)):
if x>=0:
list1.append(str1[i]) #初始化列表后用append函数添加元素
elif i!=0:
list1.append(str1[i])
flag=1
list1.reverse() #将列表所有元素倒叙
str2=''.join(list1) #将列表元素合并成一个字符串的写法
if flag==0:
answer=int(str2)
else:
answer=-int(str2) #判断是否是负数,是负数之后添加负号
if answer>2**31-1 or answer<-2**31: #范围规范
answer=0
return answer
3、回文数
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
自己解法,基础解法转成字符串:
class Solution(object):
def isPalindrome(self, x):
str1=str(x)
list1=[]
for i in range(len(str1)):
list1.append(str1[i])
list1.reverse()
str2=''.join(list1) #和上一题类似,先append添加,再reverse倒叙,再用join把列表变成一个字符串
if x>=0:
if int(str1)==int(str2):
return True #需要注意LC只认识首字母大写,其他字母小写的布尔,否则不是关键字
else:
return False #这一层的if记得else排除满足条件的补集
else:
return False #外层还有一次else
大神进阶解法,不转成字符串,java写法,大同小异:
class Solution {
public boolean isPalindrome(int x) {
if (x == 0) return true;
if (x < 0 || x % 10 == 0) return false;
int reversed = 0;
while (x > reversed) {
reversed = reversed * 10 + x % 10;
x /= 10;
}
return x == reversed || x == reversed / 10;
}
}
4、罗马数字转整数
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
这题看着十分复杂,但如果理解透彻了就很容易,字符串从左到右来,如果当前字符代表的值不小于其右边,就加上该值;否则就减去该值。以此类推到最左边的数,最终得到的结果即是答案,python可以用字典来达到对应。
自己首次解法:
class Solution(object):
def romanToInt(self, s):
res=0
for i in range(len(s)):
if s[i]=='M':
res+=1000
elif s[i]=='D':
res+=500
elif s[i]=='L':
res+=50
elif s[i]=='V':
res+=5
elif s[i]=='C' and i+1<len(s) and (s[i+1]=='D' or s[i+1]=='M'): #判断的条件要全,注意不能超出范围
res-=100
elif s[i]=='C':
res+=100
elif s[i]=='X' and i+1<len(s) and (s[i+1]=='L' or s[i+1]=='C'):
res-=10
elif s[i]=='X':
res+=10
elif s[i]=='I' and i+1<len(s) and (s[i+1]=='V' or s[i+1]=='X'):
res-=1
elif s[i]=='I':
res+=1
return res
大神解法,对字典透彻的理解:
class Solution:
def romanToInt(self, s):
a = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000} #建立罗马字母和数字的对应
ans=0
for i in range(len(s)):
if i<len(s)-1 and a[s[i]]<a[s[i+1]]: #不超范围&&根据键进行值的比较,i和i+1正好是从左到右
ans-=a[s[i]]
else:
ans+=a[s[i]]
return ans
5、最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串“”
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
暴力解法
class Solution(object):
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
if strs == []: #先排除是空的情况
return ''
answer = strs[0] #answer是列表的第一个字符串元素
for i in strs:
while answer not in i or i.index(answer) != 0:
'''
用了python的index函数,字符串存在用in,not in判断是否存在
index判断是否是前缀(从第一位开始能找到相同)
'''
answer=answer[:-1] #在遍历里持续切片,切割掉自己的最后一位
if answer == '': #如果切割到最后都没有一样的就返回空
return ''
return answer
INDEX()
Python index() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内
和find区别:find找不到返回-1,index找不到报错
str找寻的范围字符串.index(str目标字符串, beg=0, end=len(string))
str -- 指定检索的字符串
beg -- 开始索引,默认为0。
end -- 结束索引,默认为字符串的长度。
str1 = "this is string example....wow!!!";
str2 = "exam";
print str1.index(str2);
print str1.index(str2, 10);
print str1.index(str2, 40);
结果:
15
15
报错