1. 找01
牛牛擁有一個長度為 n 的01 串,現在他想知道,對於每個字元,在它前面的最近的不同字元的下標是多少?
兩個下標記錄上一個01位置
int main(int argc, char *argv[]) {
int T;
cin>>T;//測試組數
while(T--){
int n;
cin>>n;
string s;
cin>>s;
int idx0 =- 1; int idx1 = -1;//分貝記錄上一個0和1的位置
vector<int> res(n,-1);
for(int i=0;i<n;i++){//遍歷所有字元
if(s[i]=='0'){
res[i] = idx1;
idx0 = i;
}
else{
res[i] = idx0;
idx1 = i;
}
}
for(int i=0;i<n;i++){
if(i>0) cout<<" ";
if(res[i]==-1) cout<<res[i];
else cout<<res[i]+1;
}
cout<<endl;
}
return 0;
}
2. 不能出現太多
給定n個數字A1,A2,..An,請求出這些數字中出現次數小於等於k的最小的數。
先雜湊計數再篩選可以避免排序
int main(int argc, char *argv[]) {
int n; int k;
cin>>n;
cin>>k;
vector<int> nums(n);
unordered_map<int,int> m;
for(int i=0;i<n;i++){
cin>>nums[i];
m[nums[i]]++;
}
int res = INT_MAX;
for(auto num:nums){
if(m[num]>k) continue;
res = min(res,num);
}
if(res==INT_MAX) cout<<-1;
else cout<<res;
return 0;
}
3. 乘2除2
給出一個大小為n的序列a,每次操作可以選擇序列a中的一個數x,把x變成x*2或者[x/2](對同一個a可以操作多次但不能既進行乘操作又進行除操作)。
點選檢視程式碼