【问题标题】: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;
}

谢谢

【问题讨论】:

标签: c++ c++11 c++14


【解决方案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


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

【讨论】:

    猜你喜欢
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多