9.13 百度笔试编程题题解
// 先占个坑,等笔试时间结束发。
1. 第一题没什么好说的,暴力枚举就行了。
小红拿到了一个字符串,她想知道有多少个 "baidu" 型子串,即第1,4个字母是辅音,其他字母是元音,且各字母均不相同。
#include <bits/stdc++.h> using namespace std; bool isVow(char c) { switch(c) { case 'a': case 'e': case 'i': case 'o': case 'u': return true; } return false; } int main() { string s; cin >> s; const int n = s.length(); int ans = 0; for (int i = 0; i < n-4; i++) { bool allDifferent = true; for (int j = i; j <= i+4; j++) { for (int k = j+1; k <= i+4; k++) { if (s[j] == s[k]) { allDifferent = false; break; } } if (!allDifferent) break; } if (allDifferent) ans += !isVow(s[i]) && isVow(s[i+1]) && isVow(s[i+2]) && !isVow(s[i+3]) && isVow(s[i+4]); } cout << ans << endl; return 0; }2. 给定一个01串,每次可以选择两个连续的数字取反(0变1, 1变0)。
能否在有限的操作次数内使所有字符相同
贪心。任意相邻的偶数个0或1,我们可以直接将其反转。而对于奇数个,我们可以反转到只剩下1个0或1。那么最终就只剩下形如 ...1.....1....1...(’.'为任意个0)或者...0...0.....0...0...(’.'为任意个1)的串。因为我们只能反转相邻的两个字符,所以我们要把这些1或者0变换到相邻的位置。假设两个1中间有n个0,即100...001,那么我们可以将最右边的两个字符反转,得到100...010,此时两个1中间有n-1个0,相当于把最右边的1往左移了一位。在经过n次反转移位之后,可以得到1100...00,再反转一次就得到全为0的串。(两个0中间有n个1的情况类似)。这说明了能够成功变换与字符0和字符1的位置无关,只与它们的数量有关。即如果给定串***有偶数个0,我们最终可以变换成全为1的串;如果有偶数个1,我们最终可以变换成全为0的串。
#include <iostream> using namespace std; bool ac(string &s) { int cnt = 0; for (char c : s) { cnt += c == '1'; } return !(cnt&1) || !((s.length()-cnt)&1); } int main() { int q; cin >> q; while (q--) { string s; cin >> s; cout << (ac(s) ? "Yes" : "No") << endl; } return 0; }3. 就是BFS模板题加了个限制条件...
给定一个字符矩阵,矩阵仅由'r','e','d'组成。
求从左上角到右下角的最少步数。可以从上下左右四个方向走,但是不能从'r'->'d', 'e'->'r','d'->'e'。
求从左上角到右下角的最少步数。可以从上下左右四个方向走,但是不能从'r'->'d', 'e'->'r','d'->'e'。
#include <bits/stdc++.h> using namespace std; int main() { int n, m; cin >> n >> m; vector<string> v(n); for (int i = 0; i < n; i++) cin >> v[i]; if (n == 1 && m == 1) { cout << 0 << endl; return 0; } vector<vector<bool>> vis(n, vector<bool>(m)); vis[0][0] = true; queue<pair<int, int>> q; q.emplace(0, 0); int step = 0; const int dx[]{-1, 0, 1, 0}, dy[]{0, -1, 0, 1}; auto canGo = [] (char from, char to) -> bool { if (from == 'r' && to == 'd') return false; if (from == 'e' && to == 'r') return false; if (from == 'd' && to == 'e') return false; return true; }; while (!q.empty()) { step ++; int sz = q.size(); while (sz--) { auto p = q.front(); q.pop(); int x = p.first, y = p.second; for (int i = 0; i < 4; i++) { int nx = x+dx[i], ny = y+dy[i]; if (nx == n-1 && ny == m-1 && canGo(v[x][y], v[ny][ny])) { cout << step << endl; return 0; } if (nx >= 0 && nx < n && ny >= 0 && ny < m && !vis[nx][ny] && canGo(v[x][y], v[nx][ny])) { vis[nx][ny] = true; q.emplace(nx, ny); } } } } cout << -1 << endl; return 0; }