2022.02.05刷题
270. 最接近的二叉搜索树值
int closestValue(TreeNode* root, double target) {
int res = root->val;
while(root){
res = abs(root->val-target)<abs(res-target)?root->val:res;
if(root->val>target) root = root->left;
else root=root->right;
}
return res;
}
342. 4的幂
bool isPowerOfFour(int n) {
if(n<1) return false;
if((n & -n)!=n) return false;
int i = 0;
for(;(n>>i & 1) ==0;i++);
return i%2 == 0;
}
401. 二进制手表
Q: 二进制手表需要几个数位?
__builtin_popcount可以统计二进制位数.- 这个题还可以枚举 位运算来做.
vector<string> readBinaryWatch(int turnedOn) {
vector<string> ans;
for(int i = 0 ;i<12;i++){
for(int j = 0;j<60;j++){
if (__builtin_popcount(i) + __builtin_popcount(j) == turnedOn) {
ans.push_back(to_string(i) + ":" + (j < 10 ? "0" : "") + to_string(j));
}
}
}
return ans;
}
408. 有效单词缩写
Q: 模拟题, 模拟单词缩写.
bool validWordAbbreviation(string word, string abbr) {
int l = 0;
for(int i = 0 ;i<word.size();i++){
if(isdigit(abbr[l])){
if(abbr[l]=='0') return false;
int len = 1;
while(l+len < abbr.size() && isdigit(abbr[l+len])) len++;
int num = atoi(abbr.substr(l,len).c_str());
if(i+num>word.size()) return false;
i+= num-1;
l+= len;
// cout<<l<<endl;
}
else if(l < abbr.size() && word[i] == abbr[l]) l++;
else{
cout<< word[i]<<abbr[l];
return false;
}
}
cout<<l<<endl;
if(l!=abbr.size()) return false;
return true;
}
改正关键:
改写遍历单词的缩写.
bool validWordAbbreviation(string word, string abbr) {
int l = 0, num = 0;
for(int i = 0; i < abbr.size(); i++){
if(isdigit(abbr[i])) {
if(num == 0 && abbr[i]=='0') return false;
num= num*10 + abbr[i]-'0';
}else{
l+=num;
num = 0;
if(l>= word.size() || abbr[i] != word[l++]) return false;
}
}
return l + num == word.size(); // 这里 记得一定要加上num
}
422. 有效的单词方块
Q: 判断单词方块是否沿对角线对称.
bool validWordSquare(vector<string>& words) {
for(int i = 0;i<words.size();i++){
for(int j = 0;j<words[i].size();j++){
if(j>= words.size() || i>=words[j].size() || words[i][j] != words[j][i]) return false;
}
}
return true;
}
157. 用 Read4 读取 N 个字符
Q: 什么鬼题目啊, 一直用指针...
507. 完美数
Q: 一个数是不是欧完全数.
bool checkPerfectNumber(int x) {
unordered_map<int,int> prime;
int num = x;
for (int i = 2; i <= x / i; i++)
{
while (x % i == 0)
{
prime[i]++;
x /= i;
}
}
if (x != 1) prime[x]++;
long long res = 1;
for (auto [b,a] : prime)
{
cout<< b << ' '<<a<<endl;
long long t = 1;
while (a--)
{
t = b * t + 1;
}
res*= t;
if(res>1e10)return false;
}
res -= num;
cout<<res<<endl;
return res == num;
}
直接模拟解法?
bool checkPerfectNumber(int x) {
if (x == 1) return false;
long long ans = 1;
for(int i = 2; i <= x/i; i++){
if(x % i == 0) {
ans += i;
if(i * i != x) ans += x / i;
}
}
cout << ans << endl;
return ans == x;
}
599. 两个列表的最小索引总和
Q: 两个列表中共同量的最小索引是多少.
A: 直接进行模拟就行.
vector<string> findRestaurant(vector<string>& list1, vector<string>& list2) {
unordered_map<string, int> um;
for(int i = 0; i < list1.size(); i++){
um[list1[i]] = i;
}
int res = INT_MAX;
vector<string> ans;
for(int i = 0; i < list2.size(); i++){
if(um.count(list2[i])){
auto j = list2[i];
if (um[j] + i < res) {
ans.clear();
ans.push_back(j);
res = um[j] + i;
}
else if(um[j] + i == res) {
ans.push_back(j);
}
}
}
return ans;
}
604. Design Compressed String Iterator
A:这种题目 建议是 初始pos设在 0 上, 处理完一个以后, pos 直接往后加, 但是留上cnt的余量出来

浙公网安备 33010602011771号