zoukankan      html  css  js  c++  java
  • 周刷题第一期总结(two sum and two numbers)

    由于深深的知道自己是事件驱动型的人,一直想补强自己的薄弱环节算法,却完全不知道从哪里入手。所以只能采用最笨的办法,刷题。从刷题中遇到问题就解决问题,最后可能多多少少也能提高一下自己的渣算法吧。

    暂时的目标是一周最少两道,可能会多做多想,工作再忙也会完成这个最低目标。

    Two sum:

    Given an array of integers, return indices of the two numbers such that they add up to a specific target.

    You may assume that each input would have exactly one solution.

    Example:

    Given nums = [2, 7, 11, 15], target = 9,
    
    Because nums[0] + nums[1] = 2 + 7 = 9,
    return [0, 1].

    这道题拿到手,感觉还算有点思路。

    要做到O(n)的算法复杂度,肯定最多遍历一遍数组从这个思路入手,大概能想到记录数字的出现,以及用目标减去记录数字,同时拿到其索引的思路

    class Solution(object):
        def twoSum(self, nums, target):
            """
            :type nums: List[int]
            :type target: int
            :rtype: List[int]
            """
            look_up = {}
            for i, num in enumerate(nums):
                if target-num in look_up:
                    return [look_up[target-num], i]
                look_up[num] = i
            return

    造一个字典,用这个字典的key记录出现的数字,用value记录其出现的索引位置。然后使用target - num 用目标数字减去当前遍历到的数字的结果有没有在look_up里面有key记录,如果有读取其索引 然后 带上现在遍历到的数字索引返回。

     Add Two Numbers:

    You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

    Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
    Output: 7 -> 0 -> 8

    这道题首先我读了半天题才理解到题意。要弄出这道题首先你要知道python里面链表一般如何实现,所以就需要去补充一些链表的知识(事件驱动学习就是这个意思)。查找了一些资料之后理解了链表再来看这道题就明白了

    首先实现一个ListNode

    class Solution(object):
        ListNode(self, val):
            self.val = val
            self.next = None

    每当我们新开一个链表,就相当于又多创建一个类似ListNode结构的object。self.next存储的是下一个链表的地址。

    这道题其实考察的是使用链表进行大数相加,由于从个位加起,所以是反转存储的方便进位。下面看代码

    class Solution(object):
        def addTwoNumbers(self, l1, l2):
            """
            :type l1: ListNode
            :type l2: ListNode
            :rtype: ListNode
            """
            dummy, carry = ListNode(0), 0
            current = dummy
    
            while l1 or l2:
                val = carry
                if l1:
                    val += l1.val
                    l1 = l1.next
                if l2:
                    val += l2.val
                    l2 = l2.next
                carry, val = val / 10, val % 10
                current.next = ListNode(val)
                current = current.next
    
            if carry == 1:
                current.next = ListNode(1)
    
            return dummy.next

    carry 代表进位的意思,dummy是初始化的存储结果链表中的头部指针,赋给current同样地址,但是current会在随后的操作中被往后移动。

    其余的都很简单了。

    第一次开始刷题,感觉不是特别习惯,也没有相关的思维。 希望万事开头难经后可以熟练起来。

  • 相关阅读:
    Java在linux环境下和windows环境下日期字符串显示不同
    PPT制作手机手指滑动效果
    linux segmentation fault记录
    Linux SDK之uClinux、Broadcom、Atheros、Realtek、Ralink、Marvell、Intel
    chrome保存网页为单个文件(mht格式)
    解决liblzo2.so缺失
    What is uClinux?
    linux(CentOS5.8)环境下搭建Radius
    去除快捷方式小箭头
    【转载】ssh(安全外壳协议)
  • 原文地址:https://www.cnblogs.com/piperck/p/5991615.html
Copyright © 2011-2022 走看看