告诉我此代码将给出错误输出的输入

Posted

技术标签:

【中文标题】告诉我此代码将给出错误输出的输入【英文标题】:Tell me the Input in which this code will give incorrect Output 【发布时间】:2020-09-18 09:59:15 【问题描述】:

有一个问题,我必须用 C++ 解决。我已经编写了整个代码并且它在给定的测试用例中工作但是当我提交它时,它说的是错误的答案。我不明白为什么它显示错误的答案。 我要求您告诉我给定代码的输入,这将给出不正确的输出,以便我可以进一步修改我的代码。

缩小数组

给定一个长度为L 的正整数数组A[]。如果A[i]A[i+1] 相等,则将它们替换为一个值为A[i]+1 的元素。多次执行此类操作后,找出数组的最小可能长度。

注意: 每次这样的操作后,数组的长度会减一,并且元素会相应地重命名。

输入格式:

第一行包含一个整数L,表示数组A的初始长度。 第二行包含L空格整数A[i] - 数组元素A[]

输出格式:

打印一个整数 - 执行上述操作任意次数后可能得到的最小长度。

例子:

输入

7
3 3 4 4 4 3 3

输出

2

示例测试用例说明

3 3 4 4 4 3 3 -> 4 4 4 4 3 3 -> 4 4 4 4 4 -> 5 4 4 4 -> 5 5 4 -> 6 4.

因此数组的长度为2。

我的代码:

#include <bits/stdc++.h>
using namespace std;

int main()

  bool end = false;
  int l;
  cin >> l;

  int arr[l];
  for(int i = 0; i < l; i++)

    cin >> arr[i];
  
  int len = l, i = 0;

  while(i < len - 1)
    if(arr[i] == arr[i + 1])
        arr[i] = arr[i] + 1;
        if((i + 1) <= (len - 1))
            for(int j = i + 1; j < len - 1; j++)
                arr[j] = arr[j + 1];
            
        
        len--;
        i = 0;
    
    else
        i++;
    
  
  cout << len;
  return 0;

谢谢

【问题讨论】:

我无法编译代码,为什么还要麻烦输入呢?请阅读Why should I not #include &lt;bits/stdc++.h&gt;? 和Why is “using namespace std;” considered bad practice? 和Why aren't variable-length arrays part of the C++ standard? 写一个奇怪的方言是可以的,但是你应该意识到这一点。您的代码不是标准 C++ @YashMalaviya 您有机会按照给出的建议进行学习。不要using namespace std;,不要#include &lt;bits/stdc++.h&gt;,不要使用VLA:s。 【参考方案1】:

如 cmets 中所述:仅选择具有相同值的前两个邻居并将它们组合起来会导致次优结果。

您需要调查应该以某种方式合并哪两个邻居。当您合并了两个邻居时,您需要调查在下一级合并哪些邻居。组合的数量可能会变得很多。

解决这个问题的一种方法是通过递归。

如果您遵循了 cmets 中的建议,那么您现在将所有输入数据都保存在 std::vector&lt;unsigned&gt; A(L) 中。

您现在可以执行std::cout &lt;&lt; solve(A) &lt;&lt; '\n';,其中solve 具有签名size_t solve(const std::vector&lt;unsigned&gt;&amp; A),如下所述:

找到A 中所有具有相同值的邻居对的索引,并将索引放入std::vector&lt;size_t&gt; neighbours。示例:如果A 包含2 2 2 3,则将01 放入neighbours

如果没有找到邻居 (neighbours.empty() == true),则返回 A.size()

定义一个minimum 变量并使用A.size() - 1 对其进行初始化,这是您知道的此时您可以得到的最糟糕的结果。所以,size_t minimum = A.size() - 1;

遍历存储在neighbours (for(size_t idx : neighbours)) 中的所有索引

A 复制到新的std::vector&lt;unsigned&gt; 中。我们就叫它cpy。 将cpy[idx] 加一并删除cpy[idx+1]。 致电size_t result = solve(cpy)。这就是递归的用武之地。 result 是否小于minimum?如果是这样,请将 result 分配给 minimum

返回minimum


我不认为我通过提供一种算法来解决这个问题而破坏了编程练习。它应该还有很多事情要处理。大数据等无法递归。

【讨论】:

以上是关于告诉我此代码将给出错误输出的输入的主要内容,如果未能解决你的问题,请参考以下文章

请帮我找出错误

输入正确的答案会给出错误的输出。我该如何解决?

linux c socket错误:输入/输出错误

使用 D&C 算法对数组元素求和会给出错误的输出

[我只是简单地输入了tf.Tensor Tensorflow 2.2.0中给出的代码,这是我的代码:请为错误提供解决方案

在MATLAB中将输出数字保存到png文件