今日写题五道,依旧在简单难度补题,稍微回顾,都是在15min内完成。
383. 赎金信
普通模拟题。先对两个字符串排序,之后遍历第一个字符串,同时查找一遍第二个字符串中的字符,是否第一个字符串中的字符都存在。
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
sort(ransomNote.begin(),ransomNote.end());
sort(magazine.begin(),magazine.end());
int len1 = ransomNote.length(), len2 = magazine.length();
bool flag = false;
int i = 0, j = 0;
for(i = 0; i < len1 ; i++) {
bool find1 = false;
while(j < len2) {
if(ransomNote[i] == magazine[j]) {
j += 1;
find1 = true;
break;
} else
j += 1;
}
if(find1 == false)
break;
}
if(i == len1)
flag = true;
return flag;
}
};
401. 二进制手表
简单模拟题。遍历时 和 分的可能出现数字,之后判定二进制下的一个个数,对二者求和,判定结果是否等于给定的数字,如果等于,转换为字符串记录,注意分的转换在一位数的时候前面需要加0。
class Solution {
public:
vector<string> readBinaryWatch(int num) {
vector<string> ans;
for(int i = 0; i < 12 ; i++) {
for(int j = 0; j < 60; j++) {
int sum = numofone(i) + numofone(j);
if(sum == num) {
string tempans = to_string(i) + ":";
if(j < 10)
tempans = tempans + "0" + to_string(j);
else
tempans = tempans + to_string(j);
ans.push_back(tempans);
}
}
}
return ans;
}
int numofone(int num){
int ans = 0;
while(num) {
if(num&1)
ans += 1;
num /= 2;
}
return ans;
}
};
404. 左叶子之和
递归回溯题。左叶子,先在左节点,之后为叶节点。符合条件判定成功则相加求和,否则递归树的下一层节点。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int ans = 0;
int sumOfLeftLeaves(TreeNode* root) {
ans = 0;
dfsTree(root);
return ans;
}
void dfsTree(TreeNode* root) {
if(root == nullptr)
return;
if(root->left != nullptr) {
TreeNode* temp = root->left;
if(temp->left == nullptr && temp->right == nullptr)
ans = ans + temp->val;
dfsTree(root->left);
}
dfsTree(root->right);
}
};
455. 分发饼干
简单模拟题。对于两个数组按照从小到大排序,然后遍历,记录即可。
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(),g.end());
sort(s.begin(),s.end());
int ans = 0, len1 = g.size(), len2 = s.size(), j = 0;
for(int i = 0; i < len1; i++) {
if(j >= len2)
break;
if(g[i] <= s[j]) {
ans += 1;
j += 1;
}
else {
while(j < len2 && s[j] < g[i])
j++;
if(j == len2)
break;
else {
ans += 1;
j += 1;
}
}
}
return ans;
}
};
482. 密钥格式化
简单模拟题。在原字符串上操作,否则内存不足,使用string的内置函数能够节省时间,不然会超出时间限制。第一个字符串存储和法字符个数对于K的余数,在第一遍遍历的时候统计得出结果即可。
class Solution {
public:
string licenseKeyFormatting(string S, int K) {
string ans = "";
int len1 = S.length(), sum = 0;
for(int i = 0; i < len1 ; i++) {
if(S[i]!='-') {
if(islower(S[i]))
S[i] = toupper(S[i]);
sum += 1;
} else {
S.erase(i,1);
i -= 1;
}
len1 = S.length();
}
//int start = 0;
if(sum % K == 0) {
for(int i = K, j = 1; j < sum / K; i += K, j++ ) {
S.insert(i,"-");
i += 1;
}
} else {
for(int i = sum % K, j = 0; j < sum / K; i += K, j++ ) {
S.insert(i,"-");
i += 1;
}
}
return S;
}
};