[日常刷题]leetcode第十三天

136. Single Number

Given a non-empty array of integers, every element appears twice except for one. Find that single one.

Note:

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

Example 1:

Input: [2,2,1]
Output: 1

Example 2:

Input: [4,1,2,1,2]
Output: 4

Solution in C++:
关键点:

  • 不可增添新空间 && 数学法

思路:

  • 我开始想的是异或的操作,因为偶数次和奇数次的特征让我觉得太明显了。可是我不知道0异或a = a这个公式,让我有点不好下手。然后想了用查找的方法,一个一个找,如果在剩下的数中找到了继续,没找到就是所求,但是发现数列无序,没办法用二分。后来看了解析有异或操作方法,了解公式之后立马就实现了。感觉就这个比较nice,所以其他方法就点一下就好,还有一个数学的方法是:2*(a+b+c) - (a+a+b+b+c) = c所以用set构建了个无重复的数组还是有空间冗余。
int singleNumber(vector<int>& nums) {
        int result = 0;
        for (auto num : nums)
            result ^= num;
        return result;
    }

141. Linked List Cycle

Solution in C++:
关键点:

  • 唯一性判断

思路:

  • 遍历之后再发现和头结点一样的就判断有环,但是对其中如何唯一标识每个结点有了疑惑。后来看了解析之后发现,引用地址这个问题就能解决。还有一个比较有意思的方法是比作跑步,快的和慢的如果是圈总会相遇,如果不是快的先到的思想。
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool hasCycle(ListNode *head) {
        if (head == nullptr || head->next == nullptr)
            return false;
        
        ListNode *slow = head;
        ListNode *faster = head->next;
        while(faster != slow){
            if (faster == nullptr || faster->next == nullptr)
                return false;
            slow = slow->next;
            faster = faster->next->next;
        }
        return true;
    }
};

小结

今天还是收获了蛮多新的思考问题的方法和角度。很nice。不过今天状态不佳,大多就是基本思索了一下就去看答案了,急着想去睡觉、、、

知识点

  • a ^ 0 = a, a ^ b ^ a = b
  • 用元素地址去唯一标识元素
  • 对于链表圈的问题可以比作操场跑步来处理,转换为快与慢的相遇问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值