c++ - 如何在 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]
}
}
我能得到一些帮助吗?
解决方案
我们只能猜测面试官希望看到什么。如果我是面试官,我希望你能保持简单。这是我认为可以期望在面试情况下从头开始编写的代码:
#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
有一行出现两次,最后一行丢失。
作为一名面试官,我不会对第一次尝试没有产生正确的输出感到惊讶。我不在乎那个。那不是减号。我关心的是你对此有何反应。你知道接下来的步骤吗?你有修复错误输出的策略吗?还是您只是因为第一次尝试没有设法编写正确的代码而感到恐慌?这就是我想在面试中检查的内容,然后这就是练习的结束。我想问更多不同的问题,而不是给你时间来修复所有错误并编写正确的经过良好测试的代码,因为我知道这比我们在面试中花费的时间更多。
我会把它留给你来修复上面的代码;)
推荐阅读
- .net-5 - Blazor WebAssembly 托管应用程序中的 UseExceptionHandler("/error")
- batch-file - 为什么批处理文件不将两个文件连接到一个新文件?
- c# - 如何将 SelectedItem 从其子项设置为 ListViewItem
- android - 创建一个跟踪当前可见页面的计数器
- android - 尝试从空对象引用上的字段“android.widget.TextView com.choudhary.numberreciever.MainActivity.IncomingNumber”读取
- flutter - Flutter 如何在 Listview.builder、SingleChildScrollView 等可滚动小部件中隐藏滚动条(拇指)
- c# - 如何在列表中添加多个项目以获取修复字典键
- java - 桥接-java多线程问题
- reactjs - 如何在 jsx 文件中导入和导出类
- java - 如何使用 Lambda 参数为 ArrayList 实现 toArray() 方法?