C++程序 找到旋转 K 个索引的数组的范围和查询
在编写C++程序过程中,我们经常需要解决数组旋转问题。比如,我们可能要找到旋转K个索引后的数组范围或提供一种查询方式。本文将介绍如何使用C++编写代码解决这个问题。
找到旋转K个索引后的数组范围
首先,我们需要定义一个旋转函数rotate()来旋转被输入的数组。该函数将数组的前k个元素移动到数组的末尾。
#include <algorithm> //需要引用该标准库提供的rotate函数
void rotate(int k, int* arr, int n)
{
k %= n;
std::rotate(arr, arr + k, arr + n);
}
rotate函数该怎么使用呢?我们可以根据需要旋转的元素个数k来调用rotate函数。
#include<iostream>
int main()
{
int arr[6] = {1, 2, 3, 4, 5, 6};
rotate(2, arr, 6);
for(int i=0;i<6;i++)
std::cout << arr[i] << " "; //输出 3 4 5 6 1 2
return 0;
}
在该示例中,我们将数组arr旋转了2个位置,输出为3 4 5 6 1 2。
但是,如果我们在旋转后需要查找数组中的某个值呢?我们必须找到旋转后该值在数组中的位置。我们可以这样做:
#include<iostream>
int findElement(int arr[], int n, int val)
{
for(int i=0;i<n;i++)
{
if(arr[i]==val)
return i;
}
return -1;
}
int main()
{
int arr[6] = {1, 2, 3, 4, 5, 6};
rotate(2, arr, 6);
int index = findElement(arr,6,4);
std::cout << index; //输出 3
return 0;
}
在该示例中,我们找到旋转后该值在数组中的位置,输出为3。
但是,如果我们不确定旋转了多少元素,我们该怎么办?我们可以编写另一个函数findK()来找到旋转了k个元素。
#include<iostream>
int findElement(int arr[], int n, int val)
{
for(int i=0;i<n;i++)
{
if(arr[i]==val)
return i;
}
return -1;
}
int findK(int* arr, int n) {
for(int i=0;i<n-1;i++)
{
if(arr[i]>arr[i+1])
return i+1;
}
return 0;
}
int main()
{
int arr[6] = {1, 2, 3, 4, 5, 6};
rotate(2, arr, 6);
int k = findK(arr,6);
std::cout << k << " "; //输出 2
int index = findElement(arr,6,4);
std::cout << index; //输出 3
return 0;
}
在该示例中,我们找到旋转了k个元素并执行查找操作。
查询操作
假设我们有一个排好序的数组,其中包含5个数字:2、4、6、8和10。我们要确保能够快速查找单个数字在数组中是否存在。因此,我们可以使用二分查找算法。
二分算法需要首先将数组排序。我们可以使用C++提供的标准库函数sort()来排序数组:
#include<iostream>
#include <algorithm>
int main()
{
int arr[5] = {2, 4, 6, 8, 10};
std::sort(arr, arr + 5); //使用std::sort函数排序
bool res = std::binary_search(arr, arr + 5, 6); //使用std::binary_search函数查找元素6是否在数组中
std::cout << res; //输出 1
return 0;
}
在该示例中,我们使用了std::sort函数将数组进行排序,并使用std::binary_search函数通过二分查找算法快速查找元素6是否在数组中。最终输出结果为1,表示元素6在数组中存在。
结论
在本文中,我们学习了如何使用C++编写程序解决数组旋转和查询问题。我们定义了旋转函数rotate()和查找函数findElement()、findK()。通过使用C++提供的标准库函数sort()和binary_search(),我们能够快速地对一个排好序的数组进行查找。希望这篇文章对C++学习者有所帮助。