LeetCode50天刷题计划第二季(Day 31 — 两数之和 II - 输入有序数组(11.10-11.20)分数到小数(11.30-12.30)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

没看出来跟 两数之和 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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值