例5.1查找第k小數(shù)
時間限制:1s 空間限制:64M
題目描述
查找一個數(shù)組的第K小的數(shù)膛堤,注意同樣大小算一樣大掏导。 如 2 1 3 4 5 2 第三小數(shù)為3人断。
輸入描述:
輸入有多組數(shù)據(jù)涝滴。
每組輸入n便脊,然后輸入n個整數(shù)(1<=n<=1000),再輸入k沥阳。
輸出描述:
輸出第k小的整數(shù)跨琳。
示例輸入
6
2 1 3 5 2 2
3
示例輸出
3
代碼5.1.1 解法一:選擇排序+數(shù)組去重
#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;
}
}
//數(shù)組去重
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
題目描述
輸入一個數(shù)n,然后輸入n個數(shù)值各不相同桐罕,再輸入一個值x脉让,輸出這個值在這個數(shù)組中的下標(從0開始,若不在數(shù)組中則輸出-1)功炮。
輸入描述:
測試數(shù)據(jù)有多組溅潜,輸入n(1<=n<=200),接著輸入n個數(shù)死宣,然后輸入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 若輸入數(shù)據(jù)有序:二分查找
#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;
}