【牛客网】字节跳动2019春招研发部分编程题汇总
1-萬萬沒想到之聰明的編輯
解題思路
此題的編輯規則如下
從題目可以看出,本題的規則實際上只有兩個,1和2,1是指連續3個同樣的字母,則去掉一個;
2是指兩對一樣的字母,則去掉第二對的一個字母。第3條規則告訴我們規則是從左往右匹配,因此每次我們去掉的字母都將是形成這種規則的最后一個字母。
所以對給定的字符串,先對其執行規則1,再執行規則2。
代碼
#include<iostream> #include<string> using namespace std; int main() {int n;cin >> n;while (n--) {string s;cin >> s;//規則1for (int i = 2; i < s.length(); i++) {if (s[i] == s[i - 1] && s[i - 1] == s[i - 2]) {s.erase(i, 1);//滿足規則1,刪除一個該字符i--;if (s.length() < 3) break;}}//規則2for (int i = 3; i < s.length(); i++) {if (s[i] == s[i - 1] && s[i - 2] == s[i - 3]) {s.erase(i, 1);//滿足規則2,刪除一個該字符i--;if (s.length() < 3)break;}}cout << s << endl;} }2-萬萬沒想到之抓捕孔連順
解題思路
參考自該博客
題目的意思,就是給定一系列已排序的數,從這些數中任選三個數,使其滿足最大和最小的數差值小于等于給定值。
我覺得下面該blog的思想有些不對,如果打印出具體的組合將是錯誤的結果,但是由于其計算組合數的數目是對的,因此產生了正確的結果;
例如下面的輸入
對于blog中的思想,其將產生的組合分別為:
#此時left=0,right=2 1 2 3 #此時left=0,right=3 1 2 3 1 2 4 1 3 4可以看出組合數量是對的,但真正的組合并沒有求對,在right=3時,發生了重復,多了一組,而這組應該為2 3 4
代碼
#include<iostream> #include<vector> using namespace std; long long C(long long n) {//計算Cn2的值return (n - 1) * n / 2; } int main() {int N,D;while (cin >> N >> D) {vector<int> arr(N);for (int i = 0; i < N; i++) {cin >> arr[i];}//固定p_left,移動p_right,如果滿足兩者之差<=D,則從[p_left+1,p_right]中選擇兩個,即為存在的個數long p_left = 0,p_right =2,count = 0;for (; p_right < N;p_right++) {while (arr[p_right] - arr[p_left] > D) {p_left++;}count += C(p_right - p_left);}cout<<count%99997867;}return 0; }4-特征提取
解題思路
使用map<pair<int, int>, pair<int, int>>;//key-特征(x,y)-value-(起點幀的序號,特征計數)
遍歷每個幀,加入新特征或者更新已存在特征的幀起點,特征計數
1、如果該特征不存在,則添加該特征到map
2、如果該特征存在
通過判斷(當前幀號==特征起點幀號+特征計數),相等表示連續
(1)如果該特征是連續的,特征計數+1;
(2)如果該特征是不連續的,更新特征起點為當前幀號,特征計數+1;
參考自題解
代碼
#include<iostream> #include<map> #include<algorithm> using namespace std; int main() {int n;cin >> n;//樣例數for (int k = 0; k < n; k++) {int m;//幀數cin >> m;map<pair<int, int>, pair<int, int>> mp;int maxLen = 1;for (int i = 0; i < m; i++) {int t;//本幀特征數cin >> t;for (int j = 0; j < t; j++) {int x, y;pair<int, int> p;cin >> p.first >> p.second;//判斷該幀是否存在//不存在if (mp.find(p) == mp.end()) {//原本無該特征,添加該特征mp[p].first = i;//該幀的起點幀mp[p].second = 1;//該特征初始計數為1}//存在else {//連續if (i == mp[p].second + mp[p].first) {mp[p].second++;maxLen = max(maxLen, mp[p].second);}//不連續else {mp[p].first = i;//更新起始幀號mp[p].second = 1;//更新計數}}}}cout << maxLen << endl;}return 0; }總結
以上是生活随笔為你收集整理的【牛客网】字节跳动2019春招研发部分编程题汇总的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu 监视显卡使用情况
- 下一篇: mysql数据库删除数据的三种方式: