在不使用任何数据结构的情况下从输入中删除重复项

贾德普(Jaideep Shekhar)

免责声明:这个问题更具挑战性,并且帖子也很长。仅在空闲时间阅读!

问题:

基本上,假设只有一行整数输入:

32352\n     // assuming single digits only and no spaces for simplification

我们必须从输入中删除重复项,然后显示它们。因此,输出应为:

After removing duplicates: 2, 3, 5      // display them in any order

但是,有一个陷阱:

  • 不要使用任何 数据结构容器。

编辑:我相信容器就是我的意思(谢谢弗拉德!)。

所以,我的问题是:我的实现中有什么错误,还有另一种(更好的)实现方法吗?

我的思考过程:

由于不允许使用任何数据结构,因此无法存储输入(我认为吗?)。
但是,由于它已经在输入时存储在内存中,所以这不是问题。

更多的问题是删除重复项。我们将不得不操纵输入流。

让我震惊的第一件事是我们可以对输入进行排序。那是,

32352

变成:

22335

现在,只需打印每个范围的第一个元素。
为此,我遇到了std::cin.get()std::cin.putback()方法,都接受char

我也意识到我将不得不使用递归。

因此,代码变为(我使用了插入排序):

编码:

sort()函数是错误所在。它使用运行中的indexala数组,用于唯一标识每个元素。

在每次迭代中,index_of_element都会找到并选择元素,然后确定需要在其余(虚拟)数组中的何处放置元素。例如,如果在我们的原始输入中:

32352    // S = sorted subarray
SU--U    // U = unsorted subarray

,第一个2被选中,我们“移位” 3(如3 < 2)。
现在,没有其他元素需要转移,我们“放置” 2
结果应为:

23352
SSU-U

(越野车)实现:

bool sort(int index_of_element, int index = 0, char prev_element = 0)
{
    static char element;
    char digit;
    // retrieve an element from memory
    std::cin.get(digit);
    // If not end of input
    if(digit != '\n')
    {
        // store the element for comparision
        if(index == index_of_element)
        {
            element = digit;
        }
        // continue forward until '\n'
        bool result = sort(index_of_element, index + 1, digit);
        // if we are in sorted subarray
        if(index <= index_of_element)
        {
            // If element belongs here(also if this is first element(prev_element is 0)), place it
            if(element > prev_element)
            {
                digit = element;
                // Signal that element has been placed
                element = 0;
            }
            // Else, if element not already placed, we need to shift elements
            else if(element != 0)
            {
                // Place the previous element here
                digit = prev_element;
            }
        }
        // Put it back in memory
        std::cin.putback(digit);
        // And return the result
        return result;
    }
    // Which is generated here when end of input is reached
    else
    {
        // If sorted all elements, break loop
        if(index_of_element == index)
        {
            return false;
        }
        // Else, continue sorting
        else
        {
            return true;
        }
    }
}

(有一堵代码墙,但是我不想跳过任何相关内容),它应该用作:

...
int index_of_element = 0;
while(sort(index_of_element++));
...

显示功能已准备就绪,并且可以正常工作。
我所知道的是,它陷入了无限循环,并且值丢失了。
怎么了?

我应该添加输出(帖子已经很长了)吗?

卡雷斯

一次只可以使用功能对象来完成此操作。

#include <iostream>
#include <sstream>
#include <functional>

void print_unique_ints(std::istream & in, std::ostream & out, std::function<bool(int)> unseen) {
    for (int i; in >> i;) {
        if (unseen(i)) {
            out << i << ' ';
            print_unique_ints(in, out, [&](int j){ return (i != j) && unseen(j); });
            return; // not actually needed, previous call only ends when input is exhausted
        }
    }
}

int main() {
    print_unique_ints(std::cin, std::cout, [](int){ return true; });
}

现场观看

每次调用都会print_unique_ints跳过以前看到的int,打印看不见的int,并将其添加到过滤器中

用值代替变量;和函数调用表达式;在第一个电话

    for (int i; in >> i;) { // i = 3
        if (true) {
            out << 3 << ' ';
            print_unique_ints(...) // see below
        }
    }

第二

    for (int i; in >> i;) { // i = 2
        if ((3 != i) && true) {
            out << 2 << ' ';
            print_unique_ints(...) // see below
        }
    }

第三

    for (int i; in >> i;) { // i = 3, 5
        if ((2 != i) && (3 != i) && true) { // skips over the 3
            out << 5 << ' ';
            print_unique_ints(...) // see below
        }
    }

第四

    for (int i; in >> i;) { // i = 2
        if ((5 != i) && (2 != i) && (3 != i) && true) { // skips the 2 and finds the end of input
        }
    }

请注意,&& true永远不要更改结果if

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在不使用Distinct的情况下删除SQL查询中的重复项?

来自分类Dev

在不使用set的情况下从嵌套列表中删除重复项

来自分类Dev

在不使用Util类的情况下从数组中删除重复项

来自分类Dev

在不使用set()的情况下删除元组中的重复项

来自分类Dev

如何在不使用`uniq`的情况下删除数组中的重复项?

来自分类Dev

在不使用熊猫的情况下合并和删除两个 csv 中的重复项

来自分类Dev

危害指针如何在不使用锁的情况下安全地回收并发数据结构中的内存?

来自分类Dev

在不使用附加缓冲区的情况下从Python中删除字符串中的重复项

来自分类Dev

如何在Laravel中不使用任何关系的情况下删除多表数据库中的数据

来自分类Dev

防止在不使用索引的情况下插入重复项

来自分类Dev

在不使用额外数组的情况下删除重复字符

来自分类Dev

如何在忽略标点的情况下删除数据帧中的重复项?

来自分类Dev

在条件基于另一列的情况下从熊猫数据框中删除重复项

来自分类Dev

如何在不使用集合的情况下从python列表中删除重复的单词?

来自分类Dev

如何在SQL中不使用DISTINCT的情况下删除重复值?

来自分类Dev

如何在不使用集合的情况下从python列表中删除重复的单词?

来自分类Dev

如何在不使用数组的情况下删除字符串中的重复单词?

来自分类Dev

在不使用迭代器的情况下,从用户输入中删除arraylist的元素

来自分类Dev

Gtk Perl:在不使用占位符的情况下删除“文本输入”中的默认文本

来自分类Dev

在不使用任何循环的情况下将匹配的数据放入javascript数组中

来自分类Dev

如何在不使用任何DBMS的情况下将键值对数据存储在程序中?

来自分类Dev

在不导入库和使用集合的情况下删除列表中重复项的最快方法

来自分类Dev

在C ++中,可以在不生成整个数据结构的情况下找到数据结构吗?

来自分类Dev

在JAVA中的字符串中删除重复项。不允许使用其他数据结构

来自分类Dev

在JAVA中的字符串中删除重复项。不允许使用其他数据结构

来自分类Dev

ASP.NET MVC - 在不使用模型注释的情况下检查国家名称中的重复项

来自分类Dev

如何在不使用任何内置php函数的情况下搜索字符串中的连续重复字符?

来自分类Dev

在块中存在键且块之间存在间隙的情况下,要使用哪种数据结构?

来自分类Dev

在不使用任何输入类型的情况下,将用户的本地电子邮件ID存储在mongodb中

Related 相关文章

  1. 1

    如何在不使用Distinct的情况下删除SQL查询中的重复项?

  2. 2

    在不使用set的情况下从嵌套列表中删除重复项

  3. 3

    在不使用Util类的情况下从数组中删除重复项

  4. 4

    在不使用set()的情况下删除元组中的重复项

  5. 5

    如何在不使用`uniq`的情况下删除数组中的重复项?

  6. 6

    在不使用熊猫的情况下合并和删除两个 csv 中的重复项

  7. 7

    危害指针如何在不使用锁的情况下安全地回收并发数据结构中的内存?

  8. 8

    在不使用附加缓冲区的情况下从Python中删除字符串中的重复项

  9. 9

    如何在Laravel中不使用任何关系的情况下删除多表数据库中的数据

  10. 10

    防止在不使用索引的情况下插入重复项

  11. 11

    在不使用额外数组的情况下删除重复字符

  12. 12

    如何在忽略标点的情况下删除数据帧中的重复项?

  13. 13

    在条件基于另一列的情况下从熊猫数据框中删除重复项

  14. 14

    如何在不使用集合的情况下从python列表中删除重复的单词?

  15. 15

    如何在SQL中不使用DISTINCT的情况下删除重复值?

  16. 16

    如何在不使用集合的情况下从python列表中删除重复的单词?

  17. 17

    如何在不使用数组的情况下删除字符串中的重复单词?

  18. 18

    在不使用迭代器的情况下,从用户输入中删除arraylist的元素

  19. 19

    Gtk Perl:在不使用占位符的情况下删除“文本输入”中的默认文本

  20. 20

    在不使用任何循环的情况下将匹配的数据放入javascript数组中

  21. 21

    如何在不使用任何DBMS的情况下将键值对数据存储在程序中?

  22. 22

    在不导入库和使用集合的情况下删除列表中重复项的最快方法

  23. 23

    在C ++中,可以在不生成整个数据结构的情况下找到数据结构吗?

  24. 24

    在JAVA中的字符串中删除重复项。不允许使用其他数据结构

  25. 25

    在JAVA中的字符串中删除重复项。不允许使用其他数据结构

  26. 26

    ASP.NET MVC - 在不使用模型注释的情况下检查国家名称中的重复项

  27. 27

    如何在不使用任何内置php函数的情况下搜索字符串中的连续重复字符?

  28. 28

    在块中存在键且块之间存在间隙的情况下,要使用哪种数据结构?

  29. 29

    在不使用任何输入类型的情况下,将用户的本地电子邮件ID存储在mongodb中

热门标签

归档