leetcodeday2 两数相加

两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

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

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
输入:l1 = [0], l2 = [0]
输出:[0]

提示:

  • 每个链表中的节点数在范围 [1, 100] 内
  • 0 <= Node.val <= 9
  • 题目数据保证列表表示的数字不含前导零

方法一:模拟
思路与算法

由于输入的两个链表都是逆序存储数字的位数的,因此两个链表中同一位置的数字可以直接相加。

我们同时遍历两个链表,逐位计算它们的和,并与当前位置的进位值相加。具体而言,如果当前两个链表处相应位置的数字为 n1,n2进位值为carry,则它们的和为 n1+n2+carry;其中,答案链表处相应位置的数字为=(n1+n2+carry)mod10,而新的进位值为⌊n1+n2+carry⌋/ 10 。

如果两个链表的长度不同,则可以认为长度短的链表的后面有若干个 00 。

此外,如果链表遍历结束后,有 carry>0,还需要在答案链表的后面附加一个节点,节点的值为carry。


#
# @lc app=leetcode.cn id=2 lang=python3
#
# [2] 两数相加
#

# @lc code=start
# 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:
        # 当前指针,结果链表
        result = curr = ListNode()
        # 进位项
        remainder = 0

        # 非空满足循环条件
        while l1 or l2 :
            x = l1.val if l1 else 0
            y = l2.val if l2 else 0

            total = x + y + remainder

            curr.next = ListNode(total%10)
            remainder = total//10
# 防止某一链表已经为空,空链表.next会报错
            if l1 : 
                l1 = l1.next
            if l2 : 
                l2 = l2.next
            curr = curr.next

        if remainder : 
            curr.next = ListNode(remainder)
        return result.next

        
# @lc code=end

Linux编译工具:gcc入门

凡有成者,必务于实。凡有所学,皆成性格。

1 什么是gcc

gcc的全称是GNU Compiler Collection,它是一个能够编译多种语言的编译器。最开始gcc是作为C语言的编译器(GNU C Compiler),现在除了c语言,还支持C++、java、Pascal等语言。gcc支持多种硬件平台.

2. gcc的特点

  1. gcc是一个可移植的编译器,支持多种硬件平台。例如ARM、X86等等。
  2. gcc不仅是个本地编译器,它还能跨平台交叉编译。所谓的本地编译器,是指编译出来的程序只能够在本地环境进行运行。而gcc编译出来的程序能够在其他平台进行运行。例如嵌入式程序可在x86上编译,然后在arm上运行。
  3. gcc有多种语言前端,用于解析不同的语言。
  4. gcc是按模块化设计的,可以加入新语言和新CPU架构的支持。
  5. gcc是自由软件。任何人都可以使用或更改这个软件。

gcc编译程序主要经过四个过程:

预处理(Pre-Processing)
编译 (Compiling)
汇编 (Assembling)
链接 (Linking)3. gcc编译程序的过程

leetcode day1 两数之和

  给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
输入:nums = [3,2,4], target = 6
输出:[1,2]

解题思路
1 暴力解法:每个元素都被枚举多次,算法时间复杂度为o(n^2)

2用 Python 中 list 的相关函数求解

解题关键主要是想找到 num2 = target – num1,是否也在 list 中,那么就需要运用以下两个方法:

num2 in nums,返回 True 说明有戏
nums.index(num2),查找 num2 的索引

def twoSum(nums, target):
    lens = len(nums)
    j=-1
    for i in range(lens):
        if (target - nums[i]) in nums:
            if (nums.count(target - nums[i]) == 1)&(target - nums[i] == nums[i]):#如果num2=num1,且nums中只出现了一次,说明找到是num1本身。
                continue
            else:
                j = nums.index(target - nums[i],i+1) #index(x,i+1)是从num1后的序列后找num2                
                break
    if j>0:
        return [i,j]
    else:
        return []

哈希表:类似字典,key:value
哈希解法:只要一次遍历,遍历到i时,在哈希表中查找target-i是否存在即可
若target-i存在:返回i和target-i的下标
若target-i不在:在哈希表中添加第i个元素
时间:o(n)
空间:o(n)

解题思路:哈希表

如果我们使用暴破,会导致时间复杂度为 n^2这样的代价无疑是很大的。 所以我们很容易想到用哈希表来解决这个问题。
我们遍历到数字 a 时,用 target 减去 a,就会得到 b,若 b 存在于哈希表中,我们就可以直接返回结果了。若 b 不存在,那么我们需要将 a 存入哈希表,好让后续遍历的数字使用。

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        hashtable=dict()
        for i,num in enumerate(nums):
            if target-num in hashtable:
                return [hashtable[target-num],i]
            hashtable[num]=i
# @lc code=end

补充知识:

​Python 3 新特性:类型注解

前几天有同学问到,这个写法是什么意思:

def add(x:int, y:int) -> int:
    return x + y

我们知道 Python 是一种动态语言,变量以及函数的参数是不区分类型。因此我们定义函数只需要这样写就可以了:

def add(x, y):
    return x + y

这样的好处是有极大的灵活性,但坏处就是对于别人代码,无法一眼判断出参数的类型,IDE 也无法给出正确的提示。

于是 Python 3 提供了一个新的特性:
函数注解

也就是文章开头的这个例子:

def add(x:int, y:int) -> int:
    return x + y

用 : 类型 的形式指定函数的参数类型,用 -> 类型 的形式指定函数的返回值类型

在 Python 3.6 中,又引入了对变量类型进行注解的方法:

a: int = 123
b: str = 'hello'

更进一步,如果你需要指明一个全部由整数组成的列表:

from typing import List
l: List[int] = [1, 2, 3]

但同样,这些仅仅是“注解”,不会对代码产生任何影响。

人生 总是起起落落落落萝莉落落
see you again

辰泡泡的随笔

总有生生不息的温柔和不期而遇的温暖。

磨刀不误砍柴工,读完硕士再打工


弃我去者,昨日之日不可留。 乱我心者,今日之日多烦忧。

自我介绍:梦想成为一名…,好吧,暂时没有啥梦想,未来可能会从事通信or互联网行业,研究生在读,想成为一个技术大佬,奈何现在还是一个菜鸡,每天看似很努力,只不过是怕自己一旦空闲下来,就会感到莫名的孤单和烦恼,可能是因为还没npy。现在正在减肥,但奈何总是经不住美食的诱惑。

  • 写博客的初衷:其实写这个东西只是想记录下我的学习和生活 ,感觉随着时间的流逝,有些事情大概率会遗忘,就把这些生活学习中的事情记录下来,可能等无聊的时候,打开来看看,原来自己写过这些东西,学过这些东西。
  • 关于孤独:
    我越来越觉得,学会排解忧伤、孤独真的是一个很酷的能力,可以说,这是我在大学期间上的最优秀的一门课。 试着去交朋友,但是并不强求和任何人做朋友; 试着去融入集体,但是并不抗拒一个人独处的曼妙时光。 对待朋友,不要强求你付出多少,朋友必须付出多少,不要道德绑架朋友。社交很累,久而敬之,才是相处之道。
  • 关于未来:对于未来,只是希望不要浪费掉每一天,快乐健康就好。

https://www.nihaowua.com/