2024年2月7日力扣题目训练
- 2024年2月7日力扣题目训练
- 501. 二叉搜索树中的众数
- 504. 七进制数
- 506. 相对名次
- 201. 数字范围按位与
- 209. 长度最小的子数组
- 87. 扰乱字符串
2024年2月7日力扣题目训练
2024年2月7日第十四天编程训练,今天主要是进行一些题训练,包括简单题3道、中等题2道和困难题1道。惰性太强现在才完成,不过之后我会认真完成的。
501. 二叉搜索树中的众数
链接: 众数
难度: 简单
题目:
运行示例:
思路:
这道题就是遍历,然后记录每个数出现的次数,出现最多就是众数,所以利用中序遍历和哈希表。
代码:
class Solution {
private:
unordered_map<int,int> res;
int maxans = 0;
public:
void inorder(TreeNode* root){
if(root == NULL) return;
inorder(root->left);
res[root->val]++;
maxans = max(res[root->val],maxans);
inorder(root->right);
}
vector<int> findMode(TreeNode* root) {
vector<int> ans;
if(root == NULL) return ans;
inorder(root);
for (auto it = res.begin(); it != res.end();it++) {
if(it->second == maxans){
ans.push_back(it->first);
}
}
return ans;
}
};
504. 七进制数
链接: 七进制数
难度: 简单
题目:
运行示例:
思路:
这道题就是一个进制问题,利用/和%就可得到。
代码:
class Solution {
public:
string convertToBase7(int num) {
if(num==0)return "0";
int flag = 0;
if(num < 0) flag = 1;
num = abs(num);
string ans;
while(num){
ans += num % 7 + '0';
num /= 7;
}
if(flag == 1) ans+='-';
reverse(ans.begin(),ans.end());
return ans;
}
};
506. 相对名次
链接: 相对名次
难度: 简单
题目:
运行示例:
思路:
这道题就是排序,然后找到对应位置就可,sort为从小到大排序,而本题需要从大到小排序,所以我们可以加负号进行排序。
代码:
class Solution {
public:
vector<string> findRelativeRanks(vector<int>& score) {
vector<string> ans;
if(score.size() == 0) return ans;
vector<int> temp(score.size());
for(int i =0; i < score.size(); i++) temp[i] = -score[i];
sort(temp.begin(),temp.end());
for(int i = 0; i < score.size(); i++){
int idx = find(temp.begin(),temp.end(),-score[i])-temp.begin();
if(idx == 0){
ans.push_back("Gold Medal");
}
else if(idx == 1){
ans.push_back("Silver Medal");
}
else if(idx == 2){
ans.push_back("Bronze Medal");
}
else{
ans.push_back(to_string(idx+1));
}
}
return ans;
}
};
201. 数字范围按位与
链接: 按位与
难度: 中等
题目:
运行示例:
思路:
这道题我知道是利用公共前缀,但是不知道怎么用。官方是通过观察得到的。
按位与运算的性质。对于一系列的位,只要有一个零值的位,那么这一系列位的按位与运算结果都将为零。
我们可以发现,对所有数字执行按位与运算的结果是所有对应二进制字符串的公共前缀再用零补上后面的剩余位。
代码:
class Solution {
public:
int rangeBitwiseAnd(int left, int right) {
int shift = 0;
while(left < right){
left >>= 1;
right >>= 1;
shift++;
}
return left << shift;
}
};
209. 长度最小的子数组
链接: 子数组
难度: 中等
题目:
运行示例:
思路:
这道题我的思路就是暴力法不错过任何一个,但是时间超过了。官方的方法还有前缀和+二分查找以及滑动窗口这两种方法来解决,这里给出滑动窗口的答案。
代码:
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int n = nums.size();
if(n == 0) return 0;
int ans = INT_MAX;
int start = 0,end = 0;
int sum = 0;
while(end < n){
sum += nums[end];
while(sum >= target){
ans = min(ans, end-start+1);
sum -= nums[start];
start++;
}
end++;
}
return ans == INT_MAX?0:ans;
}
};
87. 扰乱字符串
链接: 字符串
难度: 困难
题目:
运行示例:
思路:
这道题我是没有什么思路,官方采用动态规划。
代码:
class Solution {
private:
int memo[30][30][31];
string s1,s2;
public:
bool checkIfSimilar(int i1, int i2, int length){
unordered_map<int,int> freq;
for (int i = i1; i < i1 + length; ++i) {
++freq[s1[i]];
}
for (int i = i2; i < i2 + length; ++i) {
--freq[s2[i]];
}
if (any_of(freq.begin(), freq.end(), [](const auto& entry) {return entry.second != 0;})) {
return false;
}
return true;
}
bool dfs(int i1, int i2, int length) {
if (memo[i1][i2][length]) {
return memo[i1][i2][length] == 1;
}
if (s1.substr(i1, length) == s2.substr(i2, length)) {
memo[i1][i2][length] = 1;
return true;
}
if (!checkIfSimilar(i1, i2, length)) {
memo[i1][i2][length] = -1;
return false;
}
for (int i = 1; i < length; ++i) {
if (dfs(i1, i2, i) && dfs(i1 + i, i2 + i, length - i)) {
memo[i1][i2][length] = 1;
return true;
}
if (dfs(i1, i2 + length - i, i) && dfs(i1 + i, i2, length - i)) {
memo[i1][i2][length] = 1;
return true;
}
}
memo[i1][i2][length] = -1;
return false;
}
bool isScramble(string s1, string s2) {
memset(memo, 0, sizeof(memo));
this->s1 = s1;
this->s2 = s2;
return dfs(0, 0, s1.size());
}
};