LeetCode解题整理
来源:互联网 发布:c语言strcmp函数 编辑:程序博客网 时间:2024/06/11 15:53
136_Single_number
Given an 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?
/* ^ 异或运算,不同为1,相同为0; 1^1=0; 0^0=0; 1^0=1; 0^1=1; 先转换成二进制,然后异或,3^5 → 11^101=110 → 6. 还有一个用途,交换两个数的值: a=a^b; b=a^b; // b=a^b^b=a, b^b 抵消所以a^b^b得a,实现b=a,把a赋值给b a=a^b; // 带入最原始的a,b值 ☞ a=(a^b)^(a^b)^b,抵消之后剩余b*/#include<iostream>#include<vector>using std::vector;class Solution {public:int singleNumber(vector<int>& nums) {int result = 0;for (int i = 0; i!= nums.size(); ++i){result ^= nums[i];}return result;}};int main(){Solution b;vector<int> a = { 1,2,3,4,5,6,7,8,9,11,31,1,2,3,4,5,6,7,8,9,11,88,66,88,66 };std::cout<<b.singleNumber(a);system("pause");}//输出31
其它解法:
class Solution{public:int singleNumber(vector<int> &nums){std::unordered_map<int, int> cnts; // {number, count}for (auto x : nums){if (cnts.find(x) != cnts.end()){cnts[x]++;}else{cnts.insert({ x, 1 });}}for (auto x : cnts){if (x.second != 2){return x.first;}}return 0;}};
class Solution{public:int singleNumber(vector<int> &nums){int n = 0;for (auto x : nums){n ^= x;}return n;}};
class Solution {public:int singleNumber(vector<int>& nums) {sort(nums.begin(), nums.end());for (int i = 0; i<nums.size(); i += 2)if (nums[i] != nums[i + 1])return nums[i];return 0;}};
137_Single_Number II
#include<iostream>#include<vector>#include<algorithm>#include<unordered_map>class Solution{public:int singleNumber(std::vector<int> &nums){std::unordered_map<int, int> cnts; // {number, count}for (auto x : nums){if (cnts.find(x) != cnts.end()){cnts[x]++;}else{cnts.insert({ x, 1 });}}for (auto x : cnts){if (x.second != 3){return x.first;}}return 0;}};int main(){Solution b;std::vector<int> a = { 1,2,3,4,5,6,7,8,9,11,31,1,2,3,4,5,6,7,8,9,11,88,66,88,66,88,66,1,2,3,4,5,6,7,8,9,11 };std::cout << b.singleNumber(a);system("pause");return 0;}//输出31其他方法:
class Solution {public:int singleNumber(vector<int>& nums) {int one = 0, two = 0, three = 0;for (auto i : nums) {two |= (one & i);one ^= i;three = ~(one & two);one &= three;two &= three;}return one;}};
class Solution {public:int singleNumber(vector<int>& nums) {int a = 0, b = 0;for (int i = 0; i < nums.size(); ++i) {b = (b ^ nums[i]) & ~a;a = (a ^ nums[i]) & ~b;}return b;}};
class Solution {public:int singleNumber(vector<int>& nums) {const int W = sizeof(int) * 8;int count[W];std::fill_n(&count[0],W, 0);for (int i = 0; i < nums.size(); i++) {for (int j = 0; j < W; j++) {count[j] += (nums[i] >> j) & 1;count[j] %= 3;}}int result = 0;for (int i = 0; i < W; i++) {result += (count[i] << i);}return result;}};
575_Distribute_Candies
#include <iostream>#include <vector>#include <assert.h>#include <algorithm>#include <unordered_map>#include <unordered_set>using namespace std;class Solution {public:int distributeCandies(vector<int>& candies) {if (candies.size() % 2 != 0)return 0;unordered_map<int, int> HASH;int res = 0;for (int c : candies) {HASH[c]++;if (HASH[c] == 1 && res<candies.size() / 2)res++;}return res;}int distributeCandies1(vector<int>& candies) {assert(candies.size() % 2 == 0);//assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行sort(begin(candies), end(candies));//将数组排序int ans = 1;//记录糖果种类for (int i = 0; i!=candies.size()-1; ++i) {if (/*i == 0 ||*/ candies[i] != candies[i + 1])++ans;}return min(ans, (int)candies.size() / 2);}int distributeCandies2(vector<int>& candies) {return min(unordered_set<int>(candies.cbegin(), candies.cend()).size(), candies.size() / 2);}};int main(){Solution a;int candies[] = { 1, 1, 1, 2, 2, 2, 3, 4 ,4,4,5,6,1,2,3,1};int candiesLength = sizeof(candies) / sizeof(candies[0]);vector<int> Candies(candies, candies + candiesLength);cout << "the maximum number of kinds of candies the sister could gain is ";cout << a.distributeCandies(Candies) << endl;system("pause");return 0;}
1_Two_Sum
#include<unordered_map>using std::vector;using std::unordered_map;class Solution {public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> _map;vector<int>result;for (int i = 0; i != nums.size(); ++i){_map[nums[i]] = i;}for (auto i = 0; i != nums.size(); ++i){const int gap = target - nums[i];if (_map.find(gap)!= _map.end() && _map[gap] > i){result.push_back(i );result.push_back(_map[gap] );}}return result;}};int main(){Solution b;vector<int>a = { 2,7,11,15 };int f = 9;vector<int>c (b.twoSum(a, f));for (auto i : c)std::cout << i << ",";system("pause");}
阅读全文
1 0
- LeetCode解题整理
- Leetcode 解题报告整理索引(更新至154题)
- LeetCode 解题
- LeetCode 解题
- poj解题报告整理
- leetcode整理
- [LeetCode]Same Tree解题
- LeetCode 解题报告索引
- [LeetCode]Permutations,解题报告
- Leetcode Triangle 解题报告
- [LeetCode]Anagrams,解题报告
- leetCode解题报告
- [LeetCode]Candy, 解题报告
- leetcode解题目录
- leetCode Candy解题分享
- LeetCode 解题API
- 【LeetCode】Candy 解题报告
- 【LeetCode】Triangle 解题报告
- 多个视频,重复循环播放的解决方式
- Linux安装RocketMQ
- opencv把视频的每一帧保存为图片
- 获取textview的行数
- 第十一周-项目2
- LeetCode解题整理
- 移动端fixed + Input 调用键盘的时候fixed无效问题(css解决)
- 如何修改PHP上传文件大小的限制
- 第十周——项目一(4)—哈夫曼树
- Netlink+内核实现分析(二):通信
- Java中各种集合及其特点功能总结
- PAT Basic 1016
- Java并发编程:Callable、Future和FutureTask
- 第11周项目5-迷宫问题之图深度优先遍历解法