第一题:统计是给定字符串前缀的字符串数目
思路:用哈希表来存储字符串的前缀,for循环查找
代码:
class Solution {
public:
int countPrefixes(vector<string>& words, string s) {
unordered_map<string, int> mp;
string str;
for(int i = 0; i < s.size(); i ++ ){
str += s[i];
mp[str] = 1;
}
int cnt = 0;
for(auto i : words)
if(mp.count(i))
cnt ++;
return cnt;
}
};
第二题:最小平均差
思路:前缀和+模拟,因为看错题目导致wa了两次,啊啊,当时就感觉要炸,果然炸了。
代码:
class Solution {
public:
int minimumAverageDifference(vector<int>& nums) {
int n = nums.size();
//if(n == 1) return 0;
vector<long long> sum(n + 1);
for(int i = 1; i <= n; i ++)
sum[i] = sum[i - 1] + nums[i - 1];
int m;
long long s = 1e9;
for(int i = 0; i < n; i ++){
long long l = sum[i + 1] / (i + 1);
long long r;
if(i == n - 1) r = 0;
else r = (sum[n] - sum[i + 1]) / (n - i - 1);
if(s > fabs(r - l)){
s = fabs(r - l);
m = i;
}
}
//cout << s;
return m;
}
};
第三题:统计网格图中没有被保卫的格子数
思路:用一个二维数组来暴力模拟,当时没看清守卫也挡住视线一直超时,就放弃了,啊,没有想到是题目没有看清,我是傻子
代码:
class Solution {
public:
int countUnguarded(int m, int n, vector<vector<int>>& guards, vector<vector<int>>& walls) {
int st[m][n];
memset(st, 0, sizeof st);
int sum = 0;
for(auto &t : walls) st[t[0]][t[1]] = 2, sum ++;
for(auto &t : guards) st[t[0]][t[1]] = 2, sum ++;
for(auto &t : guards){
int x = t[0], y = t[1];
for(int i = x + 1; i < m && st[i][y] != 2; i ++) if(st[i][y] == 0) st[i][y] = 1,sum ++;
for(int i = x - 1; i >= 0 && st[i][y] != 2; i --) if(st[i][y] == 0) st[i][y] = 1,sum ++;
for(int i = y + 1; i < n && st[x][i] != 2; i ++) if(st[x][i] == 0) st[x][i] = 1,sum ++;
for(int i = y - 1; i >= 0 && st[x][i] != 2; i --) if(st[x][i] == 0) st[x][i] = 1,sum ++;
}
return n * m - sum;
}
};
额。。第4题看了一眼题目可能是一个bfs,但不单单是一个简单的bfs,这对bfs本就不会的我来说无疑是难上加难就放弃了