class Solution {
public:
int reverse(int x) {
int rev = 0;
while(x != 0)
{
if(rev > INT_MAX / 10 || rev < INT_MIN / 10)
return 0;
rev = rev * 10 + x % 10;
x /= 10;
}
return rev;
}
};
class Solution {
public:
bool isPalindrome(int x) {
if(x < 0 || x % 10 == 0 && x != 0) return false;
int half = 0;
while(half < x)
{
half = half * 10 + x % 10;
x = x / 10;
}
return x == half || x == half / 10;
}
};
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> res;
int n = nums.size();
for(int i = 0; i < 1 << n; i ++)
{
vector<int> tmp;
for(int j = 0; j < n; j ++)
if(i >> j & 1) {tmp.push_back(nums[j]);}
res.push_back(tmp);
}
return res;
}
};
class Solution {
public:
int singleNumber(vector<int>& nums) {
int tmp = 0;
for(auto x : nums) tmp ^= x;
return tmp;
}
};
class Solution {
public:
int cuttingRope(int n) {
if(n <= 3) return 1 * (n - 1);
int res = 1;
if(n % 3 == 1) res *= 4, n -= 4;
if(n % 3 == 2) res *= 2, n -= 2;
while(n)
{
res *= 3;
n -= 3;
}
return res;
}
};
class Solution {
public:
int hammingWeight(uint32_t n) {
int res = 0;
for(int i = 31; i>= 0; i --)
{
res += n >> i & 1;
}
return res;
}
};
class Solution {
public:
vector<int> printNumbers(int n) {
int max = 1;
while(n --)
{
max *= 10;
}
vector<int> res;
for(int i = 1;i < max; i ++)
{
res.push_back(i);
}
return res;
}
};
class Solution {
public:
vector<int> singleNumbers(vector<int>& nums) {
int res = 0;
for(auto x : nums)
res ^= x;
int n = 0;
while((res & 1)==0) n ++, res >>= 1;
int a = 0, b = 0;
for(auto x : nums)
{
if(x >> n & 1) a ^= x;
else b ^= x;
}
return {a,b};
}
};
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ans = 0;
for (int i = 31; i >= 0; i --) {
int cnt = 0;
for (int x : nums) {
if (x >> i & 1) {
cnt ++;
}
}
if (cnt % 3 == 1) {
ans = (ans * 2) + 1;
}
else {
ans = ans * 2;
}
}
return ans;
}
};
class Solution {
public:
int add(int a, int b) {
int x = ~(1 << 31);
while(b)
{
int c = (a & b & x) << 1;
a = a ^ b;
b = c;
}
return a;
}
};

class Solution {
public:
vector<int> constructArr(vector<int>& nums) {
if(nums.empty()) return {};
int n = nums.size();
vector<int> a(n);
vector<int> b(n);
vector<int> res(n);
a[0] = 1;
b[n - 1] = 1;
for(int i = 1; i < n; i ++)
a[i] = a[i - 1] * nums[i - 1];
for(int i = n - 2; i >= 0; i --)
b[i] = b[i + 1] * nums[i + 1];
for(int i = 0; i < n; i ++)
res[i] = a[i] * b[i];
return res;
}
};
class Solution {
public:
vector<int> constructArr(vector<int>& A) {
if(A.empty()) return vector<int>();
int n = A.size();
vector<int> B(n);
for(int i = 0, p = 1; i < n; i ++)
{
B[i] = p;
p *= A[i];
}
for(int i = n - 1, p = 1; i>=0; i --)
{
B[i] *= p;
p *= A[i];
}
return B;
}
};
class Solution {
public:
int hammingDistance(int x, int y) {
int n = x ^ y;
int counter = 0;
while( n > 0)
{
counter += n & 1;
n >>= 1;
}
return counter;
}
};
class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
int n = nums.size();
vector<int> res;
for(int i = 0; i < n; i ++)
{
int index = abs(nums[i]) - 1;
nums[index] = -abs(nums[index]);
}
for(int i = 0; i < n; i ++)
{
if(nums[i] > 0) res.push_back(i + 1);
}
return res;
}
};