C++相关练习及详细讲解

目录

    • 题1:输出数组中第k小的数
    • 在数组内找出查找数字在该数组第一次出现的索引

题1:输出数组中第k小的数

题目描述:
给定一个数组arr 输出数组中第k小的数
如果不存在 输出-1
输入格式:
第一行输入一个数字n 代表数组arr大小
第二行依次输入n个数
第三行输入一个数字k
输出格式:
输出数组中第k小的数 如果不存在 输出-1
测试样例:
C++相关练习及详细讲解_第1张图片

分析:
根据set容器去重的特性以及set容器内部按照从小到大的顺序排列
将数组内所有元素输入到set容器内,然后对set迭代器进行遍历,如果遍历到第k个元素存在则存在第k小的数,进行输出;如果不存在,也就是迭代器到end的位置,则输出-1。

举例:
数组元素:3 3 2
set容器:2 3
如果k=2,则输出3
如果k=3,此时set迭代器遍历到end()的位置,不存在该数据,则输出-1

#include
#include

using namespace std;
int main()
{
	//数组大小
	int n;
	//定义第k小的数
	int kmin;
	cin >> n;
	int *arr = new int[n];
	//给数组元素传值
	for (int i = 0; i < n; ++i)
	{
		cin >> arr[i];
	}
	//数组传入set容器
	set<int> s(arr, arr + n);
	cin >> kmin;
	//用来记录遍历位置
	int count = 1;
	set<int>::iterator it = s.begin();

	while (it != s.end())
	{
		//如果第k小的数存在则输出该值,跳出循环
		if (count == kmin)
		{
			cout << *it;
			break;
		}
		++it;
		++count;
	}
	//如果循环正常结束,则第k个值不存在,输出-1
	if (it == s.end())
	{
		cout << -1 << endl;
	}
	delete[] arr;

	return 0;
}

在数组内找出查找数字在该数组第一次出现的索引

题目描述
给定一个长度为N的单调不递减整数数组 arr,进行Q次询问。对于每次询问,给出一个整数X,要求找出X在arr中第一次出现的下标,如果X未在数组中出现过,则输出-1。
输入格式
第一行输入两个整数N,Q 其中N 代表数组 arr 长度,Q代表询问次数
第二行输入N个整数 用空格分开
第三行输入Q个整数 用空格分开
输出格式
在一行中输出Q次查询的结果 每个整数用空格分开

分析:
用三个数组分别记录要查询的值,被查询的值,值在给定数组的索引。
首先给出最简单遍历的方法,该方法时间复杂度较高

int main()
{

    int n,q;
    cin >> n >> q;
    //数组元素放入arr
    int* arr = new int[n];
    for(int i = 0; i < n; ++i)
    {
        cin >> arr[i];
    }
    
    //查询元素放入arr_q
    int* arr_q = new int[q];
    for(int i = 0; i < q; ++i)
    {
        cin >> arr_q[i];
    }
	//查询结果放入result
    int* result = new int[q];
    for(int i = 0; i < q; ++i)
    {
        int Q = arr_q[i];
        int idx = -1;
        for(int j = 0; j < n; ++i)
        {
            if(arr[j] == Q)
            {
                idx = j;
                break;
            }
        }
        result[i] = idx;
    }

    for(int i = 0; i < q; ++i)
    {
        cout << result[i] << " ";
    }
    cout << endl;
    
	delete[] arr;
    delete[] arr_q;
    delete[] result;
	return 0;
}

方法二:
上述方法在面对数据量大时时间复杂度过高,可以使用二分查找降低查询次数。

#include

using namespace std;

int binarySearch(int* arr, int n, int Q)
{
    int left = 0;
    int right = n - 1;
    int idx = -1;

    while(left <= right)
    {
        int mid = (right + left)/2;
        if(arr[mid] == Q)
        {
            idx = mid;
            right = mid - 1;
        }
        else if(arr[mid] > Q)
        {
            right = mid - 1;
        }
        else if(arr[mid] < Q)
        {
            left = mid + 1;
        }
    }
    return idx;
}

int main()
{

    int n,q;
    cin >> n >> q;
    //数组元素放入arr
    int* arr = new int[n];
    for(int i = 0; i < n; ++i)
    {
        cin >> arr[i];
    }
    
    //查询元素放入arr_q
    int* arr_q = new int[q];
    for(int i = 0; i < q; ++i)
    {
        cin >> arr_q[i];
    }

    int* result = new int[q];
    for(int i = 0; i < q; ++i)
    {
        int Q = arr_q[i];
        int idx = binarySearch(arr, n, Q);
        result[i] = idx;
    }

    for(int i = 0; i < q; ++i)
    {
        cout << result[i] << " ";
    }
    cout << endl;
    
    delete[] arr;
    delete[] arr_q;
    delete[] result;

    return 0;
}

你可能感兴趣的:(c++,算法,习题)