刷題_day16,繼續加油啊
一、字符串替換
題目解析
這道題是一道簡單的字符題目,題目給我們一個字符串
A
,和n
表示A
字符串的長度,再給出一個字符數組arg
,m
表示arg
中是數據個數。然我們在字符串
A
中找到%s
然后替換成arg
中的字符;
算法分析
這道題就非常簡單簡單了,我們直接在A
中尋找%s
,然后將arg
中的字符替換即可。
當然這里沒有必要在原字符串中進行操作,創建一個新的字符串ret
即可。
這里需要注意:
A
字符串中的%s
的個數可能會小于arg
中的字符數量,
代碼實現
class StringFormat {
public:string formatString(string A, int n, vector<char> arg, int m) {// write code herestring ret;int sz = A.size();int k = 0;for(int i=0,j=1;j<sz;i++,j++){if(A[i]!='%' || A[j] !='s')ret+=A[i];else{ret+=arg[k++];i++;j++;}}if(A[sz-2]!='%')ret+=A[sz-1];while(k<arg.size())ret+=arg[k++];return ret;}
};
二、神奇數
題目解析
這道題,給定我們一個區間
[l , r]
,讓我們找出來其中神奇數的個數;**神奇數:**對于一個數
x
,使用它的某兩位組成的一個兩位數是一個質數,那這個數就是神奇數。
算法分析
對于這道題,思路就簡單明了了,你就是暴力枚;枚舉出來所有可能的兩位數,判斷是否是質數即可。
遍歷區間
[l , r]
,判斷是否是神奇數,是就計數加一;判斷是否是神奇數:先將數的每一位存到一個數組中,然后枚舉所有可能的兩位數,判斷這兩位數是否是質數;如果是,這個數就是神奇數;如果不是,那就繼續枚舉,直到枚舉完所有的。(枚舉完所有的就表示這個數不是神奇數)
判斷是否是質數:(首先進行一下判斷,如果
x<2
,這個數就不是質數)從2
開始判斷x
是否能被整除,如果能那就不是質數,如果不能就繼續遍歷;遍歷到sqrt(x)
時遍歷結束;(遍歷到sqrt(x)
就表示這個數是質數。
代碼實現
#include <iostream>
#include <vector>
#include<cmath>
using namespace std;bool isprim(int x)
{if(x<2) return false;for(int i = 2;i<=sqrt(x);i++){if(x % i == 0)return false;}return true;
}
int check(int n)
{//將n的每一位存到數組中vector<int> num;while(n){num.push_back(n%10);n/=10;}for(int i = 0;i<num.size();i++){for(int j = 0;j<num.size();j++){if(i!=j && num[i] != 0)if(isprim(num[i]*10 + num[j]))return 1;}}return 0;
}int main() {int l,r;cin>>l>>r;int ret = 0;for(int i = max(10,l);i<=r;i++){ret+=check(i);}cout<<ret<<endl;return 0;
}
三、DNA序列
題目解析
這里題目給我們應該字符串
str
,其中有A/C/G/T
組成;還給了一個n
;讓我們在
str
中找到一個子串,這個子串長度為n
,要求我們這個子串中有盡可能多的C/G
。最后要我們輸出這個子串(子串中
C/G
盡可能多)。
算法分析
這道題,相信對題目比較敏感的朋友已經想到了做法,那就是滑動窗口
。
這里就不過多敘述了,直接來看思路:
這里呢 ,我們要找盡可能多數量的
C/G
,我們就需要一個count
來記錄區間[left , right]
在C/G
的個數;然后用maxcount
;來記錄當前最多的C/G
的數量,用于比較;題目要求我們最后輸出子串,所以我們記錄一下最后子串的起始位置
begin
和長度len
。
- 進窗口:如果
A[right] == 'C' || A[right] == G
,count++
;- 判斷:如果
right - left - 1 > n
,就表示當前區間長度大于n
了,就要出窗口操作;- 出窗口:如果
A[left] == 'C' || A[right] == 'G'
,就count--
;- **更新結果:**出窗口操作之后,如果區間長度等于
n
,并且當前區間內count
小于maxcount
,那就更新結果。
代碼實現
#include <iostream>
using namespace std;int main() {string str;int n;cin>>str>>n;int begin = -1,count = 0,maxcount = 0;for(int left = 0,right =0;right<str.size();right++){if(str[right]=='C'||str[right]=='G')count++;while(right - left +1 > n){if(str[left] == 'C' || str[left] == 'G')count--;left++;}if(count > maxcount){begin = left;maxcount = count;}}cout<<str.substr(begin,n)<<endl;return 0;
}
到這里本篇文章就結束了,繼續加油
我的博客即將同步至騰訊云開發者社區,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=2oul0hvapjsws