2024年2月7日第十四天编程训练,今天主要是进行一些题训练,包括简单题3道、中等题2道和困难题1道。惰性太强现在才完成,不过之后我会认真完成的。
思路:
这道题就是遍历,然后记录每个数出现的次数,出现最多就是众数,所以利用中序遍历和哈希表。
代码:
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;
}
};
思路:
这道题就是一个进制问题,利用/和%就可得到。
代码:
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;
}
};
思路:
这道题就是排序,然后找到对应位置就可,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;
}
};
思路:
这道题我知道是利用公共前缀,但是不知道怎么用。官方是通过观察得到的。
按位与运算的性质。对于一系列的位,只要有一个零值的位,那么这一系列位的按位与运算结果都将为零。
我们可以发现,对所有数字执行按位与运算的结果是所有对应二进制字符串的公共前缀再用零补上后面的剩余位。
代码:
class Solution {
public:
int rangeBitwiseAnd(int left, int right) {
int shift = 0;
while(left < right){
left >>= 1;
right >>= 1;
shift++;
}
return left << shift;
}
};
思路:
这道题我的思路就是暴力法不错过任何一个,但是时间超过了。官方的方法还有前缀和+二分查找以及滑动窗口这两种方法来解决,这里给出滑动窗口的答案。
代码:
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;
}
};
代码:
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());
}
};