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
- 用元素地址去唯一标识元素
- 对于链表圈的问题可以比作操场跑步来处理,转换为快与慢的相遇问题