leetcode刷题 441~

题目441题

排列硬币

你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。给定一个数字 n,找出可形成完整阶梯行的总行数。

n 是一个非负整数,并且在32位有符号整型的范围内。

思路

数学法或者二分法

实现

class Solution:
    def arrangeCoins(self, n: int) -> int:
        return int(((8 * n + 1) ** 0.5 - 1) // 2)

题目442题

数组中重复的数据

给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。

找到所有出现两次的元素。

你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?

示例:

输入:
[4,3,2,7,8,2,3,1]

输出:
[2,3]

思路

利用条件1 ≤ a[i] ≤ n,因此可以将a[i] -1 作为索引号,每次将索引号所在的值乘以-1,当遍历到负数时,则遇到了重复数字

实现 

class Solution:
    def findDuplicates(self, nums: List[int]) -> List[int]:
        result = []
        for i in range(len(nums)):
            index = abs(nums[i]) -1
            if nums[index] < 0:
                result.append(index+1)
            nums[index] *= -1
        return result

题目443题

压缩字符串

给定一组字符,使用原地算法将其压缩。

压缩后的长度必须始终小于或等于原数组长度。

数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。

在完成原地修改输入数组后,返回数组的新长度。

思路

双指针法:一个指针read指向读取位置,一个指针write指向写入位置

实现

class Solution:
    def compress(self, chars: List[str]) -> int:
        start = write = 0
        for read, curr in enumerate(chars):
            if read + 1 == len(chars) or chars[read+1] != curr:
                chars[write] = chars[read]
                write +=1
                if read > start:
                    for digit in str(read - start+1):
                        chars[write] = digit
                        write +=1
                start = read + 1
        return write

题目445题

两数相加II

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

思路

实现

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        stack1,stack2 = list(), list()
        while l1:
            stack1.append(l1.val)
            l1 = l1.next
        while l2:
            stack2.append(l2.val)
            l2 = l2.next
        add = 0
        result = None
        while stack1 or stack2 or add:
            a = 0 if not stack1 else stack1.pop()
            b = 0 if not stack2 else stack2.pop()
            num = a + b + add
            add = num // 10
            num = num % 10
            newnode = ListNode(num)
            newnode.next = result
            result = newnode
        
        return result

题目395题

思路实现

题目395题

思路实现

题目441题

思路实现

题目441题

思路实现 

题目395题

思路实现

题目395题

思路实现

题目395题

思路实现

题目395题

思路实现

题目441题

思路实现

题目441题

思路实现 

题目395题

思路实现

题目395题

思路实现

题目395题

思路实现

题目395题

思路实现

上一篇:Java基础:String类支持几种构造函数?


下一篇:GoLang设计模式16 - 模板方法模式