力扣刷题记录(一)

今天开始正式刷题,为找工作做准备,这篇博客用来记录一下;刷题顺序是先刷hot题目前100个

1.两数之和:

比较简单,一次就做出来。

思路:python的字典是哈希存储的,看了一下dict内置方法只有has_key,所以将值作为key,下标作为value,存储字典,然后遍历列表,以当前值为基准,用has_key判断(target-当前值)是否存在,存在则返回相应的下标即可。,代码如下:

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        info={}
        # 将数据存入到字典当中
        for i in range(len(nums)):
            info[nums[i]] = i
        for i in range(len(nums)):
            temp = target-nums[i]
            if info.has_key(temp):
                return [info[temp],i]

 2.两数相加

给了两个链表,代表两个数字,逆序存储。将两个数字相加,存储成相同的链表格式,返回。

第一次没做出来,看了答案才会的,第二次做有一些小bug,认真分析之后对一些细节地方理解更深刻了。

思路:不需要将两个数算出来然后相加,只需要将每一位相加,加的过程中判断是否有进位,如果有进位的话就多加一个1。另外注意这块没有新创建节点,而是直接使用a,b已经存在的节点,更改他们的值,注意这里是默认使用a节点,a为空了则使用b节点。另外注意循环最后一句是在拼接目标链表,而这一句

p = (a==null?b:a);是在更改目标链表的值为正确的值。
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode p = null;
        ListNode a = l1;
        ListNode b = l2;
        int carry=0;   //进位标志
        int val;    //每一位的和
        while(a!=null || b!=null){
            val = (a==null?0:a.val) + (b==null?0:b.val) + carry;  //计算该位的值
            carry = val>=10?1:0;
            val = val%10;  //必须是小于10的
            p = (a==null?b:a);    //让p指向当前a,b里面不为空的,默认是a
            p.val = val;  //更新节点的值
            a = (a==null?null:a.next);  //后移节点
            b = (b==null?null:b.next);
            p.next=(a==null?b:a);   //将p也后移一下,这一部无所谓,只是单纯的后移一下,
        }
        //最后的进位判断
        if(carry>0){
            p.next=new ListNode(1);
        }
        return l1;
    }
}

------------恢复内容结束------------

原文地址:https://www.cnblogs.com/eenio/p/11888265.html

时间: 2024-10-31 18:49:23

力扣刷题记录(一)的相关文章

力扣刷题日记 2020/03/18

力扣2  两数相加 今天刷乐扣的时候发现好多人对这道题目的解法不是很理解 于是写下我自己的理解过程 共同学习! 题干 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和. 您可以假设除了数字 0 之外,这两个数都不会以 0 开头. 已提供一个实体类: /** * Definition for singly-linked list. */ publi

力扣刷题(一)

两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] def run(nums,target): ''' 解题思路: 假定target是由nums列表内的两个元素 i

leetcode力扣刷题系列python——3、无重复字符的最长子串

题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3. 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1. 解法: 采用哈希表法:设定左右双指针l和r,遍历字符串:哈希表存储某字符s[i]最新在字符串中出现的位置index + 1,key, value

LeeCode刷题记录

在博客园上开启LeeCode刷题记录,希望可以成为一只厉害的程序媛~ 类别:Python 题目(1) 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标.你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例:给定 nums = [2, 7, 11, 15]      target = 9    因为 nums[0] + nums[1] = 2 + 7 = 9      所以返回 [0, 1]

BZOJ 刷题记录 PART 4

[BZOJ1143]CTSC的题目...先用floyed传递闭包,然后直接上匈牙利算法. [BZOJ1452]从未写过的二维树状数组.好像很简单.. struct two_bit { int f[305][305]; inline void add(int x,int z,int A) { for (;x<=n;x+=L(x)) for (int y=z;y<=m;y+=L(y)) f[x][y]+=A; } inline int ask(int x,int z) { int ans=0; f

[2015.6.28] OI刷题记录

FZSZOJ刷题记录: 1051 砝码称重: DP 多重背包 1058 liqeuer: 序列DP 1061 挖地雷:DP,注意需要倒过来做DP,同时记录路径. 1059 Number:DP 1054 数塔问题:同数字三角形,普通DP 1390 等式问题:爆搜,枚举每个+号或-号的位置 1006 中位数:维护大根堆+小根堆,每次插入调整 1005 Cube Stacking:并查集维护当前在第几个和当前集合的高度,并查集变种. 1073 DNA分子的最佳比对:序列DP 1110 奖学金:傻逼题,

首师大附中科创教育平台 我的刷题记录(3)

首师大附中科创教育平台我的刷题记录(给大家刷11--15题吧) 仅供同学们参考,禁止抄袭!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #include<iostream> #include<math.h> using namespace std; int main() { int x,y; cin>>x; y=abs(x+2); cout<<x*x-y+5<<endl; return 0; } 绝对值函数 #include

BZOJ 刷题记录 PART 5

拖了好久才写的. [BZOJ2821]接触分块大法.这道题略有点新颖.首先我们先分块,然后统计每块中每个数出现的个数. 下面是联立各个方块,预处理出第I个方块到第J个方块出现正偶数次数的个数. for (i=1;i<=s;i++) { for (j=i;j<=s;j++) { sum[i][j]=sum[i][j-1]; for (k=a[j].l;k<=a[j].r;k++) { temp[data[k]]++; if (!(temp[data[k]]&1)) sum[i][j

首师大附中科创教育平台 我的刷题记录(7)

首师大附中科创教育平台我的刷题记录(这次给大家刷多一点,31--40题吧) 仅供同学们参考,禁止抄袭!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #include<iostream> using namespace std; int main() { int n; cin>>n; if(n%4==0&&n%100!=0||n%400==0) cout<<"yes"<<endl; else cout&