【问题标题】:C Check all occurrences of a letter appear before another letterC 检查所有出现的字母出现在另一个字母之前
【发布时间】:2021-01-20 09:07:39
【问题描述】:

所以我有一个由 N 个字母 'a' 或 'b' 组成的字符串 S。 如果 A 的所有出现都在 b 的所有出现之前,这应该返回 1,否则返回 0。

B不需要出现在S中,A也不需要出现在S中

例如

S='aabbb' returns 1 
S = 'ba' returns 0
S = 'aaa' returns 1
S= 'b' returns 1

所以我的方法是在字符串上使用 for 循环并检查 b 是否出现在 a 之前:

char newstr[10] = "aabbba"; //should return 0


int len = strlen(newstr);

for (int i = 0; i < len+1; i++) {
    printf("%c", newstr[i]);
    if (newstr[i] < 'b') {
        printf("1");
    }
    else {
        printf("0");
    }

}

输出是a1a1b0b0b0a1 1所以..它部分检测a是否在b之前但不是完全正确的方式。

【问题讨论】:

    标签: c find-occurrences letter


    【解决方案1】:

    我有一个由 N 个字母 'a' 或 'b' 组成的字符串 S

    如果所有出现的 A 都在所有出现的 b 之前,则返回 1,否则返回 0。

    所以字符串中不允许有序列ba。所以只是:

    if (strstr(newstr, "ba") == NULL) { printf("1\n"); } else { printf("0\n"); }
    

    或者只是:

    printf("%d\n", !strstr(newstr, "ba"));
    

    【讨论】:

      【解决方案2】:

      您的代码只是检测a 而不检查与b 的关系。

      条件“如果所有出现的 A 都在所有出现的 b 之前,则返回 1,否则返回 0。”可以说为“如果 some A 的出现是 在一些 b 出现之后返回 1,这应该返回 0 > 否则。”。

      一个示例实现是:

      char newstr[10] = "aabbba";
      
      int b_found = 0;
      int result = 1;
      for (int i = 0; newstr[i] != '\0'; i++) {
          if (newstr[i] == 'b') {
              b_found = 1;
          } else if(b_found && newstr[i] == 'a') {
              /* 'a' is found after 'b' */
              result = 0;
          }
      }
      printf("%d", result);
      

      【讨论】:

      • 我明白了,但是如果我们说有一个带有指针参数的方法名称char *S。我需要使用 strlen(*S) 然后设置char newstr[lengthOfChar] = *S 来获取字符的长度吗?我对制作更通用的功能感到困惑。
      • 没有。 strlen(*S) 会导致分段错误,char newstr[lengthOfChar] = *S 会导致编译错误。您可以简单地删除char newstr[10] = "aabbba";,将所有newstr 替换为S,并使用S[i] != '\0' 检查您是否处理到字符串末尾。
      猜你喜欢
      • 1970-01-01
      • 2016-07-06
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-19
      • 2013-02-07
      • 2012-09-22
      相关资源
      最近更新 更多