提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
没看出来跟 两数之和 I 有什么区别
一、题目
两数之和 II - 输入有序数组
给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。
以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
你所设计的解决方案必须只使用常量级的额外空间。
示例
示例 1:
输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
示例 2:
输入:numbers = [2,3,4], target = 6
输出:[1,3]
解释:2 与 4 之和等于目标数 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3] 。
示例 3:
输入:numbers = [-1,0], target = -1
输出:[1,2]
解释:-1 与 0 之和等于目标数 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
提示
2 <= numbers.length <= 3 * 104
-1000 <= numbers[i] <= 1000
numbers 按 非递减顺序 排列
-1000 <= target <= 1000
仅存在一个有效答案
二、思路
三、代码
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
#两数之和,首先想到双指针法
left=0 #左指针指向首元素
right=len(numbers)-1 #右指针指向尾元素
ssum=numbers[left]+numbers[right]
while(ssum != target):
if(ssum <target): #和小于目标值,左指针后移
left+=1
else: #和大于目标值,尾指针前移
right-=1
ssum=numbers[left]+numbers[right] #更新和
return [left+1,right+1]
四、题目
分数到小数
给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。
如果小数部分为循环小数,则将循环的部分括在括号内。
如果存在多个答案,只需返回 任意一个 。
对于所有给定的输入,保证 答案字符串的长度小于 104 。
示例
示例 1:
输入:numerator = 1, denominator = 2
输出:“0.5”
示例 2:
输入:numerator = 2, denominator = 1
输出:“2”
示例 3:
输入:numerator = 4, denominator = 333
输出:“0.(012)”
提示
-231 <= numerator, denominator <= 231 - 1
denominator != 0
五、思路
此题模拟竖式除法,列竖式的具体过程不再赘述。对于循环节,第一次出现重复的余数即视为循环出现(因为相同的余数再怎么除也是相同的结果)。注意此处为了便于确定循环节的位置,需要建立一个对应余数和位置的哈希表。为了方便,首先判断符号,然后将可能的结果分为三种,一是可以整除的,二是有限小数,三是无限循环小数,二和三放一起
六、代码
class Solution:
def fractionToDecimal(self, numerator: int, denominator: int) -> str:
#可以整除
if(numerator%denominator == 0):
return str(int(numerator/denominator))
#有小数
if(numerator*denominator<0):#先看符号
result='-'
else:
result=''
numerator,denominator=abs(numerator),abs(denominator)#变正数
result=result+str(numerator//denominator)+'.'#先除出来整数
remainder=numerator%denominator #余数一定不为0
count=len(result) #记载小数的位置
temp={remainder:count} #加入哈希表
remainder*=10
#处理小数
while(1):
result+=str(remainder//denominator)
remainder%=denominator
if(remainder==0): #余数为0,整除了
break
if(remainder in temp): #余数重复了,给循环节加上括号即可
flag=temp[remainder] #循环节开始的地方
result=result[:flag]+'('+result[flag:]+')'
break
count+=1
temp[remainder]=count
remainder*=10
return result