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");}









原创粉丝点击