lc190 颠倒二进制
ret = (ret << 1) + (n >> i & 1);
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t ret = 0;
for (int i = 0; i < 32; ++i)
ret = (ret << 1) + (n >> i & 1);
return ret;
}
};
lc14 flag check
class Solution {
public:
string longestCommonPrefix(vector<string>& strs)
{
if(strs.empty()) return "";
//下标
string s=strs[0];
bool flag=false;
for(int i=0;i<s.size();i++)
{
for(auto& str:strs)
{
if(str[i]!=s[i])
{
flag=true;
break;
}
}
if(flag)
return s.substr(0,i);
}
return s;
}
};
lc654 选出mx,构造树
最大二叉树
class Solution {
public:
TreeNode*traversal(vector<int>&nums,int left,int right)
{
if(left>=right)return NULL;
int maxindex=left;
for(int i=left+1;i<right;i++)
if(nums[i]>nums[maxindex])maxindex=i;
TreeNode*root=new TreeNode(nums[maxindex]);
root->left=traversal(nums,left,maxindex);
root->right=traversal(nums,maxindex+1,right);
return root;
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums)
return traversal(nums,0,nums.size());
};
lc3027
class Solution {
public:
int numberOfPairs(vector<vector<int>>& points) {
// x 升序,y 降序
ranges::sort(points, {}, [](auto& p) { return pair(p[0], -p[1]); });
int ans = 0, n = points.size();
for (int i = 0; i < n; i++) {
int y1 = points[i][1];
int max_y = INT_MIN;
for (int j = i + 1; j < n && max_y < y1; j++) {
int y2 = points[j][1];
if (y2 <= y1 && y2 > max_y) {
max_y = y2;
ans++;
}
}
}
return ans;
}
};
lc93
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
int n = s.size();
vector<string> ans;
int path[4]; // path[i] 表示第 i 段的结束位置 + 1(右开区间)
// 分割 s[i] 到 s[n-1],现在在第 j 段(j 从 0 开始),数值为 ip_val
auto dfs = [&](this auto&& dfs, int i, int j, int ip_val) -> void
{
if (i == n) { // s 分割完毕
if (j == 4) { // 必须有 4 段
auto [a, b, c, _] = path;
ans.emplace_back(s.substr(0, a) + "." + s.substr(a, b - a) + "." + s.substr(b, c - b) + "." + s.substr(c));
}
return;
}
if (j == 4) { // j=4 的时候必须分割完毕,不能有剩余字符
return;
}
// 手动把字符串转成整数,这样字符串转整数是严格 O(1) 的
ip_val = ip_val * 10 + (s[i] - '0');
if (ip_val > 255) { // 不合法
return;
}
// 不分割,不以 s[i] 为这一段的结尾
if (ip_val > 0) { // 无前导零
dfs(i + 1, j, ip_val);
}
// 分割,以 s[i] 为这一段的结尾
path[j] = i + 1; // 记录下一段的开始位置
dfs(i + 1, j + 1, 0);
};
dfs(0, 0, 0);
return ans;
}
};