首页 > 解决方案 > 如何在 C++ 中重新定位一个数组中的元素

问题描述

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

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

我必须将此索引中的元素打印为每个可能的数组(有 16 个),方法是将 givenIndex 处的元素移动到数组中的每个位置并推动其余元素。

例如:

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]
        }
    }

我能得到一些帮助吗?

标签: c++arraysalgorithm

解决方案


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

#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 

有一行出现两次,最后一行丢失。

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

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


推荐阅读