序言
题型:20道选择(单选多选混合) + 3道编程
时间:2017.09.21 19:00 - 20:30
1. 题目及要求
[1] 删除字符串中重复字符
题目大意:
输入字符串(未给长度限制),要求删除重复出现的字符(保留第一个)
如:
输入: Hello World
输出:Helo Wrd内存限制:65536KB
[2] 寻找合并后数组的中位数
题目大意:
给定两个数组,要求合并非重复元素并给出合并后数组的中位数
如:
输入:
数组1:
3
1 2 3
数组2:
4
3 4 5 6
得到数组:1 2 3 4 5 6输出中位数:3.5
内存限制:65536KB
[3] 非负整数第一个缺值
题目大意:
输入数组元素个数,找出第一个缺失的非负整数
如:
输入:
5(元素个数)
-1
1
3
5
6输出:2
内存限制:65536KB
2. 思路及解答
- [1] 删除字符串中重复字符
- 设置标记数组,记录重复元素,输出非重复元素
#include <stdio.h>
#include <string.h>
void DeleteRepChar(char *s)
{
int length = strlen(s);
int i,j;
for (i = 0; i < length; i++)
{
for (j = i + 1; j < length; j++)
{
if (s[i] == 0)
continue;
if (s[i] == s[j])
s[j] = 0;
}
}
i = 0;
int n;
for (i = 0, n = 0; i < length; i++)
{
if (s[i] != 0)
s[n++] = s[i];
}
}
int main()
{
char arr[10000];
fgets(arr, 10000, stdin); //scanf("%s", arr);
DeleteRepChar(arr);
printf("%s", arr);
return 0;
}
- [2] 寻找合并后数组的中位数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int compare(const void *value1, const void *value2)
{
return *(int *)value1 - *(int *)value2; //升序
}
double FindMedian(int n, int m, int *arrOne, int *arrTwo)
{
int countOne = 0, countTwo = 0, count = 0;
double res;
int length = n + m;
int arrFinal[length];
while (countOne < n || countTwo < m)
{
if (arrOne[countOne] == arrTwo[countTwo])
{
arrFinal[count++] = arrOne[countOne];
countOne++;
countTwo++;
}
else
{
if (arrOne[countOne] > arrTwo[countTwo])
{
arrFinal[count++] = arrTwo[countTwo];
countTwo++;
}
else
{
arrFinal[count++] = arrOne[countOne];
countOne++;
}
}
if (countOne == n && countTwo < m)
{
while (countTwo < m)
{
arrFinal[count++] = arrTwo[countTwo++];
}
}
if (countTwo == m && countOne < n)
{
while (countOne < n)
{
arrFinal[count++] = arrOne[countOne++];
}
}
}
if (count % 2 == 0)
res = ((double)arrFinal[count/2] + (double)arrFinal[count/2 - 1]) / 2;
else
res = (double)arrFinal[count/2];
return res;
}
int main()
{
int n,m,i,j;
scanf("%d", &n);
int arrOne[n];
for (i = 0; i < n; i++)
{
scanf("%d", &arrOne[i]);
}
qsort(arrOne, n, sizeof(int), compare);
scanf("%d", &m);
int arrTwo[m];
for (j = 0; j < m; j++)
{
scanf("%d", &arrTwo[j]);
}
qsort(arrTwo, m, sizeof(int), compare);
double res = FindMedian(n, m, arrOne, arrTwo);
printf("%.1lf", res);
return 0;
}
- [3] 非负整数第一个缺值
- 数值检测
#include <stdio.h>
#include <string.h>
int FindMin(int n, int *array)
{
int i = 0, num = 1;
while (array[i] <= 0)
i++;
if (array[i++] != 1)
return 1;
while (i < n)
{
if (array[i] == (++num))
i++;
else
return num;
}
return array[n - 1];
}
int main()
{
int n, i;
scanf("%d", &n);
int arr[n];
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
printf("%d", FindMin(n, arr));
return 0;
}
2017.09.22