Day5:查找

例5.1查找第k小数

时间限制:1s 空间限制:64M

题目描述

查找一个数组的第K小的数,注意同样大小算一样大。 如 2 1 3 4 5 2 第三小数为3。

输入描述:

输入有多组数据。
每组输入n,然后输入n个整数(1<=n<=1000),再输入k。

输出描述:

输出第k小的整数。

示例输入

6
2 1 3 5 2 2
3

示例输出

3

代码5.1.1 解法一:选择排序+数组去重

#include <stdio.h>

int main()
{
    int n, k;
    int A[1000];
    while(scanf("%d", &n) != EOF)
    {
        for( int i = 0; i < n; i++)
        {
            scanf("%d", &A[i]);
        }
        scanf("%d", &k);
        for(int i = 0; i < n - 1; i++) //n-1趟选择排序
        {
            int min = i;
            for(int j = i+1; j < n; j++)
            {
                if( A[j] < A[min] )
                    min = j;
            }
            if( min != i){
                int temp = A[min];
                A[min] = A[i];
                A[i] = temp;
            }
        }
        //数组去重
        int m = 0;
        for(int i = 0; i < n - 1; i++)
        {
            if(A[i] != A[i+1])
                A[m++] = A[i];
        }
        printf("%d", A[k-1]);
    }
}

例5.2找x

时间限制:1s 空间限制:64M

题目描述

输入一个数n,然后输入n个数值各不相同,再输入一个值x,输出这个值在这个数组中的下标(从0开始,若不在数组中则输出-1)。

输入描述:

测试数据有多组,输入n(1<=n<=200),接着输入n个数,然后输入x。

输出描述:

对于每组输入,请输出结果。

示例输入

2
1 3
0

示例输出

-1

代码5.2.1

#include <stdio.h>

int main()
{
    int n, x;
    int A[200];
    int ans = -1;
    while(scanf("%d", &n) != EOF)
    {
        for(int i = 0; i < n; i++)
        {
            scanf("%d", &A[i]);
        }
        scanf("%d", &x);
        for(int i = 0; i < n; i++)
        {
            if(A[i] == x)
            {
                ans = i;
                break;
            }           
        }
        printf("%d", ans);
    }
    return 0;
}

代码5.2.2 若输入数据有序:二分查找

#include <stdio.h>

int main()
{
    int n, x;
    int A[200];
    int ans = -1;
    while(scanf("%d", &n) != EOF)
    {
        for(int i = 0; i < n; i++)
        {
            scanf("%d", &A[i]);
        }
        scanf("%d", &x);
        int low = 0;
        int high = n-1;
        while(low <= high)
        {  
            int mid = ( low + high ) / 2;
            if(A[mid] == x)
            {
                ans = mid;
                break;
            }
            else if(A[mid] < x)
                low = mid + 1;
            else
                high = mid - 1;
        }
        printf("%d", ans);
    }
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。