【Leetcode】1两数之和;2两数相加;7整数反转;9回文数;13罗马数字转整数;14最长公共前缀

引言

自觉自己算法或者说叫代码能力过弱,于是决定自此之后每天刷Leetcode上的题。这个不可能有什么人会看,只是自己学习的一个记录。希望自己能坚持下来。
PS: 更新:目前的确是坚持下来了,但在CSDN上还是写内容更有深度的博客合适,故接下来的刷题都直接记录在Leetcode上我的主页上了,在那里写题解也更合适些。目前我就把这几篇刷题的整合到一篇之上。之后就不在CSDN上更新Leetcode了。
PPS: Leetcode上的个人账号也叫千想

1两数之和

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        j=-1
        lens=len(nums)
        for i in range(lens):
            temp=nums[:i]
            if (target-nums[i]) in temp:
                j = temp.index(target-nums[i])
                break
        if j > -1:
            return [j,i]

2两数相加

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        dummy = p = ListNode(None) #创造两个空节点 分别可由dummy(虚的)和p指向
        sum_ = 0 # 保留每一位加和得到的数字
        while l1 or l2 or sum_: #三者只要都不为零 就可以循环下去 l1或者l2为空时 表示链表用完 sum_为0时 表示没有进位
            sum_ += (l1.val if l1 else 0) + (l2.val if l2 else 0) #这里用到了if else的单行表示式
            p.next = ListNode(sum_ % 10) #用p节点作为移动节点 逐一的延长列表 注意这里需要用ListNode来增加新节点
            p = p.next # 移动节点换到下一个
            if l1: l1=l1.next #非空就移动
            if l2: l2=l2.next
            sum_ = sum_ //10 # //是取整运算符 这里表示取sum_的十位上的数字
        return dummy.next #用到之前设置好的头节点 它的下一位就是正式的链表数字

7整数反转

class Solution:
    def reverse(self, x: int) -> int:
        revert_x = 0 #保留翻转数字
        symbol = 1 #保留正负号
        if x < 0:
            symbol = -1
            x = -x #取正
        while x != 0:
            revert_x = revert_x * 10 + x % 10
            x = x // 10
        if revert_x > 2**31 - 1 :
            return 0
        else:
             return symbol * revert_x

9回文数

class Solution:
    def isPalindrome(self, x: int) -> bool:
        if x < 0 or (x % 10 ==0 and x != 0): # 排除掉负数情况;排除掉10、3300这种末尾有零的情况
            return False
        if x // 10 == 0: # 如果是个位数,直接正确
            return True
        y = 0
        while x > y:
            y = y * 10 + x % 10 # 倒序保存数字
            x = x // 10 # 原数字缩短
            if x // 10 == y and y != 0:  #将奇数位的回文情况考虑进去
                return True             
        if x == y: # 偶数且回文
            return True
        else: 
            return False

13罗马数字转整数

class Solution:
    def romanToInt(self, s: str) -> int:
        d = {'I': 1, 'IV': 4, 'V': 5, 'IX': 9, 'X': 10, 'XL': 40, 'L': 50, 'XC': 90,  'C': 100, 'CD': 400, 'D': 500, 'CM': 900, 'M': 1000}
        result = 0
        i = 0
        while i < len(s):
            #查看当前位和下一位的字符
            str1 = s[i:i+2]  
            #如果当前位置是特殊情况,那么返回其在字典中对应值,
            #并且下一次从特殊字符之后一位开始索引
            if str1 in d: 
                result += d.get(str1) 
                i += 2
            #如果当前位不是特殊情况,那么只返回当前位的数值
            else:
                result += d[s[i]] 
                i += 1
        return result

14最长公共前缀

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        strs.sort()
        i = 0
        mins = 9999
        n = len(strs)
        while i < n:
            if len(strs[i]) < mins:
                mins = len(strs[i])
            i += 1
        x = ''
        for i in range(mins):
            if strs[0][i] != strs[n - 1][i]:
                return x
            x += strs[0][i]
        return x
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值