【问题标题】:Why this C++ program not working for few testcases?为什么这个 C++ 程序不适用于少数测试用例?
【发布时间】:2020-12-26 12:36:52
【问题描述】:

在第一行,我们写一个 0。现在在接下来的每一行中,我们查看前一行,并将每次出现的 0 替换为 01,并将每次出现的 1 替换为 10。

给定第 N 行和索引 K,返回第 N 行中的第 K 个索引符号。(K 的值是 1 索引的。)(1 索引)。

示例: 输入:N = 1,K = 1 输出:0

输入:N = 2,K = 1 输出:0

输入:N = 2,K = 2 输出:1

输入:N = 4,K = 5 输出:1

说明: 第 1 行:0 第 2 行:01 第 3 行:0110 第 4 行:01101001

问题链接: https://leetcode.com/explore/learn/card/recursion-i/253/conclusion/1675/

解决方案:

class Solution {
public:
    int kthGrammar(int N, int K) {
        if(N==0||K==0)
            return 0;
        
        string result="0";
        string finals;
        int i,j;
        for(j=0;j<N-1;j++)
        {
            
            for(i=0;i<result.length();i++)
            {
                if(result[i]=='0')
                    finals.append("01");
                else
                    finals.append("10");
            }
            result=finals;
            
        }
        return result[K-1]-'0';
    }
};

【问题讨论】:

  • C 标签已移除。请注意,C 和 C++ 是不同的语言。
  • 对于您的代码,我希望 TLE 而不是失败的测试用例。请仔细检查。
  • 在循环的每次迭代中打印result。将您的 N=4、K=5 与示例进行比较。
  • 既然 OP 已经接受了答案,让我提一下 stackoverflow.com/questions/109023/… 我认为这是最快的方法,以防 TLE 成为下一个问题。
  • 关于效率:查看第一行,并尝试将结果依赖于 K 的二进制表示,假设 K 的索引为零。

标签: c++ algorithm recursion data-structures


【解决方案1】:

您的finals 字符串仍保留旧内容。似乎你需要在每个循环转弯时清除它。

无论如何,您的方法不适合大型输入 - 因此,与其生成(巨大的)字符串,不如考虑使用一些数学计算所需的符号。

【讨论】:

  • 但是我在每个循环上都附加了,为什么我需要清除它?
  • 这个任务假设每个外循环的长度加倍。但是你做了三倍长度(“01”=>当前“01”+新“01”+新“10”=“010110”)
  • 请注意,当前字符串将是新字符串的开头,因此您可以保留当前的finals 并仅附加对字符串后半部分的处理。
【解决方案2】:
def f(n,k):
   if n == 1:
     return 0
   if k<=pow(2,n-2):
     return f(n-1,k)
   else:
     return 1-f(n-1,k-(pow(2,n-2)))

以上是一个更好的解决方案。用python编写,但可以使用相同的逻辑

【讨论】:

  • 您为实际问题提供了可行的解决方案,而不是回答问题。这没关系,但如果您解释一下您的解决方案如何工作以及为什么它更可取,答案会更好。
猜你喜欢
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
  • 2021-04-17
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
相关资源
最近更新 更多