今天开始正式刷题,为找工作做准备,这篇博客用来记录一下;刷题顺序是先刷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