文档讲解:代码随想录
题目链接:https://leetcode.cn/problems/reverse-string/
思路:
本题目很简单,我们很容易就能发现,所谓的反转其实就是指定位置的两个字符互相交换,因此我们开一个char类型的变量当中间值即可。枚举前一半字符,和后一半互换,就完成了。
核心代码:
class Solution {
public:
void reverseString(vector& s) {
int n=s.size();
char t;
for(int i=0;i
题目链接:https://leetcode.cn/problems/reverse-string-ii/
思路:
本题目是上一道题目的进阶。怎么反转字符串我们已经在LeetCode344题学会了,所以这道题的关键不在于反转,在于需要反转哪一段。
题目告诉我们,每统计2k个字符,就对这2k个字符的前k个进行反转,那我们老老实实统计即可。我们开一个cnt变量进行统计,每输入一个字符cnt自增一,当cnt等于2k时,我们可根据当前统计到的字符串的下标,确定前k个字符的起始下标和结束下标,再根据344题的反转方式反转即可。反转完了接着统计,重复上述操作。
不要忘记最后的时候处理下最终长度没达到2k的那段字符,对其单独反转一下即可。
核心代码:
class Solution {
public:
string reverseStr(string s, int k) {
int n=s.length();
int cnt=0,i=0;
while(i>1;
char t;
for(int j=l;j<=mid;j++){
t=s[j];
s[j]=s[r-j+l];
s[r-j+l]=t;
}
cnt=0;
}
i++;
}
if(cnt<=k){
int l=n-cnt,r=n-1,mid=(l+r)>>1;
char t;
for(int i=l;i<=mid;i++){
t=s[i];
s[i]=s[r-i+l];
s[r-i+l]=t;
}
}
else{
cnt-=k;
int l=n-cnt-k,r=n-1-cnt,mid=(l+r)>>1;
char t;
for(int i=l;i<=mid;i++){
t=s[i];
s[i]=s[r-i+l];
s[r-i+l]=t;
}
}
return s;
}
};
题目链接:https://leetcode.cn/problems/reverse-words-in-a-string/
思路:
这道题其实也简单,我们首先能够意识到这个字符串里就只有两种东西:单词和空格,其中单词之间用空格隔开。
我们可以开一个字符串变量t专门来统计单词,在读入题目给出的字符串时。如果当前字符不为空格,那就将这个字符加入到单词中,如果当前字符为空格,那么说明当前单词读入结束,需要将其加入到答案字符串中。
注意多个空格的情况,我们需要忽略多个空格,只保留一个空格。同时也要忽略前导和后置空格。
注意单词字符串在加入到答案字符串时,需要从答案字符串的开头加入,这样就是完成了翻转操作。
核心代码:
class Solution {
public:
string reverseWords(string s) {
int n=s.length();
string ans,t;
ans="";t="";
for(int i=0;i
题目链接:https://kamacoder.com/problempage.php?pid=1064
思路:
ACM模式下的题目其实都可以取巧,因为并不需要我们对实际的变量产生什么操作或者改变,它只要求我们对指定的输入能够输出正确的结果就可以了。
因此这道题目非常简单,我们读入字符串s后立即输出,按照字符来输出:如果当前字符不为数字就输出当前字符,如果当前字符为数字就输出字符串"number"即可。
核心代码:
#include
#include
#include
#include
using namespace std;
string s;
int n;
int main(){
cin>>s;
n=s.length();
for(int i=0;i='0'&&s[i]<='9') printf("number");
else cout<
题目链接:https://kamacoder.com/problempage.php?pid=1065
思路:
这道题目实际上就是要求我们将字符串s的后k个字符挪到字符串的开头去。
正如我上一道题目所说,我们实际上并不需要真的将s的结构进行改变。我们只需要先输出s的后k个字符,再输出前n-k个字符就可以了,我们并没有进行实际的挪移,但在输出的结果上来看,我们确实挪移了。
核心代码:
#include
#include
using namespace std;
string s;
int k,n;
int main(){
cin>>k>>s;
n=s.length();
for(int i=n-k;i
今日学习时长2h,今天题都很简单,我也非常熟悉ACM模式,因为搞过竞赛,所以不管取没取巧很容易都过了。
今天依旧写的简单些,依旧要忙着期末报告,思路都会简写。