c++ - 如何在 C++ 中重新定位一个数组中的元素

标签 c++ arrays algorithm

我参加了这个面试题但失败了,所以我来这里是为了不再失败!

我有一个大小为 16 且 5 < givenIndex < 10 的 int 数组。

我必须通过将 givenIndex 处的元素移动到数组中的每个位置并插入其余元素,来获取此索引中的元素并打印每个可能的数组(有 16 个)。

例如:

int array[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
int givenIndex = 6;

由于 array[givenIndex] = 7,我需要将 7 移动到每个可能的位置并打印该数组。

[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]

[7,1,2,3,4,5,6,8,9,10,11,12,13,14,15,16]

[1,7,2,3,4,5,6,8,9,10,11,12,13,14,15,16]

[1,2,7,3,4,5,6,8,9,10,11,12,13,14,15,16]

那是 16 个案例。

我尝试的是:

for(int i = 0;i<16;i++){
        array[i] = array[indexInsercion]
        if (i<indexInsert){
            //right shift
            array[i] = array[i+1]
        }else if(i == indexInsert){
            //no shift
        }else{
            //left shift
            array[i] = array[i-1]
        }
    }

我能得到一些帮助吗?

最佳答案

我们只能猜测面试官希望看到什么。如果我是面试官,我希望看到你把事情简单化。这是我认为可以期望在面试情况下从头开始编写的代码:

#include <iostream>
#include <array>

template <size_t size>
void print_replaced(const std::array<int,size>& x,size_t index){
    for (int i=0;i<size;++i){
        for (int j=0;j<i;++j) {
            if (j == index) continue;
            std::cout << x[j] << " ";
        } 
        std::cout << x[index] << " ";
        for (int j=i;j<size;++j) {
            if (j == index) continue; 
            std::cout << x[j] << " ";
        }
        std::cout << "\n";
    }
}


int main() {
    std::array<int,16> x{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
    print_replaced(x,6);
}

这是解决该问题的第一种方法,使用一个循环打印数组元素的 16 种不同组合。打印每一行遵循简单的逻辑:我们打印应该被替换的元素之前的所有元素,然后是应该打乱的元素,然后是剩余的元素。

很简单,但是错了。它的输出是:

7 1 2 3 4 5 6 8 9 10 11 12 13 14 15 16 
1 7 2 3 4 5 6 8 9 10 11 12 13 14 15 16 
1 2 7 3 4 5 6 8 9 10 11 12 13 14 15 16 
1 2 3 7 4 5 6 8 9 10 11 12 13 14 15 16 
1 2 3 4 7 5 6 8 9 10 11 12 13 14 15 16 
1 2 3 4 5 7 6 8 9 10 11 12 13 14 15 16 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 
1 2 3 4 5 6 8 7 9 10 11 12 13 14 15 16 
1 2 3 4 5 6 8 9 7 10 11 12 13 14 15 16 
1 2 3 4 5 6 8 9 10 7 11 12 13 14 15 16 
1 2 3 4 5 6 8 9 10 11 7 12 13 14 15 16 
1 2 3 4 5 6 8 9 10 11 12 7 13 14 15 16 
1 2 3 4 5 6 8 9 10 11 12 13 7 14 15 16 
1 2 3 4 5 6 8 9 10 11 12 13 14 7 15 16 
1 2 3 4 5 6 8 9 10 11 12 13 14 15 7 16 

有一行出现两次,最后一行不见了。

作为一名面试官,如果第一次尝试没有产生正确的输出,我不会感到惊讶。我不在乎那个。那不是减号。我关心的是你对此有何 react 。你知道接下来的步骤吗?您有修复错误输出的策略吗?或者您只是因为第一次尝试没有写出正确的代码而 panic ?这就是我想在面试中检查的内容,然后这就是练习的结尾。我想问更多不同的问题,而不是给你时间来纠正所有错误并编写正确的经过良好测试的代码,因为我知道这比我们在面试中花费的时间更多。

我会把它留给你来修复上面的代码;)

关于c++ - 如何在 C++ 中重新定位一个数组中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68396993/

相关文章:

c++ - 用> =比较字符串是什么意思

c - 如何使用 C 将数组插入方法

algorithm - 7-1 霍尔分区正确性证明

algorithm - cormen 书中的动态规划

C++ - 排序算法看不到我为用户定义类型重载的 "<"运算符。

c++ - 纤维可以在线程之间迁移吗?

c++ - VTune 探查器给出错误 : "The Data Cannot be displayed,there is no viewpoint available for data "

javascript - 如何使一个单元格包含整个数组?

java - 删除数组中的零的输出未按预期输出?

c++ - QHBoxLayout间距