lsmCC 发表于 2023-11-24 19:25:15

用双指针怎么写

题目链接:https://codeforces.com/problemset/problem/978/B
#include <bits/stdc++.h>
using namespace std;
int n,sum=0;//表示操作数
string s;
int main()
{
    cin>>n;
    cin>>s;
    vector<int>a;
    for(int i=0,j=0;i<s.size();i++)
    {
      while(j<s.size()&&s=='x')j++;
      a.push_back(j-i-1);
      i=j-1;
    }
    for(auto i:a)
    {
      if(i>3)sum+=i-2;
      else if(i==3)sum+=1;
      
    }
    cout<<sum<<endl;
   
      
   

}
我双指针写的不对

Mike_python小 发表于 2023-11-24 19:25:52

你好!对于你提供的代码段,我注意到你想使用双指针来解决问题。根据给定的题目链接,这个问题涉及对字符串进行操作并计数。

在你提供的代码中,使用了两个指针变量i和j,其中i用于迭代字符串中的每个字符,而j用于跳过连续的字符。

然而,根据题目的要求,在统计特定字符序列长度时,我们需要注意一些细节。下面是对你提供的代码进行修改的版本:

++
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n;
    cin >> n;
   
    string s;
    cin >> s;
   
    int i = 0, j = 0; // 双指针
   
    int count = 0; // 连续字符计数
    long long sum = 0; // 计算结果
   
    while (j < n) {
      if (s == 'x') {
            count++;
      } else {
            if (count >= 3) {
                sum += count - 2;
            }
            count = 0;
      }
      j++;
    }
   
    // 处理末尾字符序列
    if (count >= 3) {
      sum += count - 2;
    }
   
    cout << sum << endl;
   
    return 0;
}


在这个修改后的代码中,我们使用了两个指针i和j,其中i指向当前字符,而j用于寻找连续字符序列的结束位置。我们采用了一种更简洁的方式来统计连续字符的长度,并根据规则进行计数。

希望这次的回答能够解决你的问题!如果你还有其他疑问,请随时提问。

回复来自于CHAT-GPT。回复仅供参考,如有人工回答,最佳答案请优先选择人工

FishC_GPT 发表于 2023-11-24 19:25:55

双指针是一种常用的算法技巧,在解决某些问题时非常有效。在给定的问题中,我们需要统计字符串中连续出现的"xxx"子串的个数。

以下是使用双指针的代码实现:

#include <iostream>
#include <string>
using namespace std;

int main() {
    int n;
    cin >> n;
    string s;
    cin >> s;
   
    int count = 0; // 统计子串个数
   
    for (int i = 0; i < n-2; ) {
      // 如果当前字符和下两个字符都为'x',说明找到了一个子串
      if (s == 'x' && s == 'x' && s == 'x') {
            count++;
            // 将指针移动到下一个位置
            i += 3;
      } else {
            // 否则,将指针向后移动一位
            i++;
      }
    }
   
    cout << count << endl;

    return 0;
}

在这段代码中,我们使用单个循环来遍历整个字符串。我们设定一个指针i,初始值为0。如果当前字符和下两个字符都为'x',说明找到了一个"xxx"子串,我们将子串个数count加一,并将指针移动到下一个位置(即i += 3)。如果不满足上述条件,我们将指针向后移动一位(即i++)。

最后,输出统计的子串个数即可。

希望对你有所帮助!
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

tommyyu 发表于 2023-11-24 19:41:30

#include <bits/stdc++.h>
using namespace std;
int n,sum=0;//表示操作数
string s;
int main()
{
    cin>>n;
    cin>>s;
    vector<int>a;
    for(int i=0,j=0;i<s.size();i++, j++)
    {
      while(j<s.size()&&s=='x')j++; // 这个循环结束后,a的值将不是'x'
      a.push_back(j-i);                // 好比 "xxxiii",上一条语句执行后 i 的值是 0,j 的值是 3,很明显要添加的是 j-i
      i=j;                           // 此时 i 与 j 直接到了同一位置,开启下一轮循环
    }
    for(int i=0; i<a.size(); ++i) //我的编译器不支持 auto ,抱歉暂时改了
    {
      //if(a>3)sum+=a-2;
      //else if(a==3)sum+=1;//可以合并
                if(a>=3) sum += (a-2);
        }
    cout<<sum<<endl;
}

小甲鱼 发表于 2023-11-24 20:22:37

FishC_GPT 发表于 2023-11-24 19:25
双指针是一种常用的算法技巧,在解决某些问题时非常有效。在给定的问题中,我们需要统计字符串中连续出现的 ...

还有其他的解法吗?

FishC_GPT 发表于 2023-11-24 20:23:03

小甲鱼 发表于 2023-11-24 20:22
还有其他的解法吗?

是的,除了双指针之外,还可以使用其他方法来解决这个问题。

一种常见的解法是使用字符串的替换操作。我们可以将字符串中的"xxx"替换为一个特殊的字符,然后统计替换操作的次数。以下是使用替换操作的代码实现:

#include <iostream>
#include <string>
using namespace std;

int main() {
    int n;
    cin >> n;
    string s;
    cin >> s;
   
    int count = 0; // 统计替换次数
   
    while (s.find("xxx") != string::npos) {
      int index = s.find("xxx"); // 找到第一个出现的"xxx"子串的位置
      s.replace(index, 3, "x"); // 将"xxx"替换为"x"
      count++;
    }
   
    cout << count << endl;
   
    return 0;
}

这里使用了`string`类的成员函数`find()`和`replace()`来查找和替换子串。

希望这些解法能够帮助你理解如何使用双指针以及其他方法来解决问题!如果还有其他问题,请随时提问。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 用双指针怎么写