鱼C论坛

 找回密码
 立即注册
查看: 592|回复: 8

算法超时

[复制链接]
发表于 2023-10-10 21:22:21 | 显示全部楼层 |阅读模式
20鱼币
Description
给你一个二进制字符串s,该字符串不含前导零。

如果s包含零个或一个由连续的'1'组成的字段,返回true​​​。否则,返回false


Input
输入一个只含01的字符串s

1≤s.length≤100


Output
输出true或false
求一个高效c++算法

截屏2023-10-10 21.16.26.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-10 21:22:48 | 显示全部楼层
这道题可以使用双指针来解决,时间复杂度为O(n)。

算法步骤如下:

1. 定义两个指针left和right,分别指向字符串s的开头和结尾。

2. 当left和right指向的字符都是'1'时,将right向右移动。

3. 当left和right指向的字符不全是'1'时,判断是否存在一个'0',如果存在则返回false,否则将left向右移动。

4. 重复步骤2和3,直到left和right相遇。

5. 如果没有返回false,则返回true。

C++代码如下:

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;

  4. bool check(string s) {
  5.     int left = 0, right = s.size() - 1;
  6.     while (left < right) {
  7.         while (s[left] == '1' && s[right] == '1') {
  8.             right--;
  9.         }
  10.         if (s[left] != '1') {
  11.             if (s.find('0', left) != string::npos && s.find('0', left) < right) {
  12.                 return false;
  13.             }
  14.             left++;
  15.         }
  16.     }
  17.     return true;
  18. }

  19. int main() {
  20.     string s;
  21.     cin >> s;
  22.     cout << (check(s) ? "true" : "false") << endl;
  23.     return 0;
  24. }
复制代码


时间复杂度:O(n)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-10 21:23:06 | 显示全部楼层
这是一个相对简单的问题,我们可以通过遍历字符串来解决。我们需要找到连续的'1',并计数这些连续的'1'的数量。如果我们找到超过一个这样的连续的'1',我们就返回false。否则,我们返回true。

以下是一个C++的解决方案:

  1. #include <string>

  2. bool checkBinaryString(const std::string& s) {
  3.     int count = 0;
  4.     for (int i = 0; i < s.length(); ++i) {
  5.         if (s[ i] == '1') {
  6.             // 如果当前字符是'1',并且它是第一个字符,或者前一个字符不是'1',则增加计数
  7.             if (i == 0 || s[i - 1] != '1') {
  8.                 ++count;
  9.             }
  10.             // 如果我们找到超过一个连续的'1',则返回false
  11.             if (count > 1) {
  12.                 return false;
  13.             }
  14.         }
  15.     }
  16.     // 如果我们没有找到超过一个连续的'1',则返回true
  17.     return true;
  18. }
复制代码


这个算法的时间复杂度是O(n),其中n是字符串s的长度。这是因为我们只遍历了一次字符串。这个算法的空间复杂度是O(1),因为我们只使用了一个固定大小的变量来存储计数。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-10 21:23:15 | 显示全部楼层
问题分析:

要判断一个二进制字符串是否满足条件,即不包含连续的多个'1'。我们可以遍历字符串,检查是否存在连续的两个字符为'1'的情况。

解决方案:

以下是一种使用C++实现的高效算法,通过遍历字符串判断条件:
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. bool checkBinaryString(const string& s) {
  5.     int n = s.length();
  6.     for (int i = 0; i < n - 1; i++) {
  7.         if (s[i] == '1' && s[i+1] == '1') {
  8.             return false;
  9.         }
  10.     }
  11.     return true;
  12. }
  13. int main() {
  14.     string s;
  15.     cin >> s;
  16.     bool result = checkBinaryString(s);
  17.     cout << (result ? "true" : "false") << endl;
  18.     return 0;
  19. }
复制代码

这种算法的时间复杂度为O(n),其中n是字符串的长度。遍历一次字符串,逐个比较相邻字符是否为'1',如果找到连续的两个'1',则返回false。如果遍历结束都没有找到连续的两个'1',则返回true。

注意,该算法还假设输入的字符串不包含前导零。

希望这个算法能够帮助到你!如果你有任何其他问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-10-10 21:28:19 | 显示全部楼层
Mike_python小 发表于 2023-10-10 21:23
问题分析:

要判断一个二进制字符串是否满足条件,即不包含连续的多个'1'。我们可以遍历字符串,检查是否 ...

哥这回答案不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-10-10 21:29:55 | 显示全部楼层
Mike_python小 发表于 2023-10-10 21:23
问题分析:

要判断一个二进制字符串是否满足条件,即不包含连续的多个'1'。我们可以遍历字符串,检查是否 ...

结果应该是true
截屏2023-10-10 21.29.17.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-10-10 21:30:22 | 显示全部楼层
isdkz 发表于 2023-10-10 21:22
这道题可以使用双指针来解决,时间复杂度为O(n)。

算法步骤如下:

超时了哥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-10 22:28:24 | 显示全部楼层
上面几楼都是GPT回答的,低质量。

你能解释一下第一个样例吗?我觉得连续'1'的字段数应该是3.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-11 13:04:03 | 显示全部楼层
同问,你这个连续的1字段怎么理解?第一个样例11010100,为什么是两个?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 00:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表