考核题总结
第一题 数组
- 给定一个包含 0, 1, 2, …, n 中 n 个数的序列,找出 0 … n 中没有出现在序列中的那个数。
示例:
输入:3 接下来输入的元素个数
3,0,1
输出: 2
思路: 先对所给数组进行排序,对排序后数组进行遍历,遍历时如果与条件不符,则直接输出并break。
#include<stdio.h>
int main(){
int i, n, j, temp;
scanf("%d", &n);
int a[1000];
for(i = 0; i < n; i++){//输入
scanf("%d", &a[i]);
}
for(i = 0; i < n; i++){//排序
for(j = i; j < n; j++){
if(a[i] > a[j]){
temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
}
for(i = 0; i < n+1; i++){//判断是否满足条件
if(a[i] != i){
printf("%d", i);//输出
break;//跳出循环
}
}
return 0;
}
第二题 二分法查找
- 给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
示例:
输入:
6
2 0 2 1 1 0
输出: 0 0 1 1 2 2
类似题目:75. 颜色分类
思路:总体思路为二分法,用三个指针进行遍历,一个指向最右端结点,一个指向最左端结点,还有一个指向当前结点,如果当前节点所指向的数组为0,则和最左端指针进行交换,当前指针后移,并且最左边指针右移;如果当前结点所指向的值为1,当前节点后移,不进行交换;如果当前结点指向的值为2,则和最右端指针进行交换,此时当前结点不移动。
#include<stdio.h>
int main(){
int i, j, n, temp;
scanf("%d", &n);
int a[n];
for(i = 0; i < n; i++){
scanf("%d", &a[i]);
}
int left = 0, right = n - 1;
i = 0;
while(left < right && i <= right){
if(a[i] == 0){//0应位于数组最前面,让它与left指向的值交换
temp = a[i];
a[i] = a[left];
a[left] = temp;
left++;//因为i和left都是从0开始的,所以left的值遍历过,可以直接后移动
i++;
}
else if(a[i] == 2){//2位于数组的最后端,让他与right指向的值进行交换
temp = a[i];
a[i] = a[right];
a[right] = temp;
right--;//没有i++因为要再次进行判断,right为i后面的元素,不知道它的值是多少
}
else i++;//如果i指向的值为1 ,则后移继续判断
}
for(i = 0; i < n; i++){
printf("%d ", a[i]);
}
return 0;
}
第三题 反转链表
要求:不创建新的链表结点。
示例:
输入: 1 2 3 4 5 -1
输出: 5 4 3 2 1
类似题目:24. 反转链表
思路:先用尾插法创立链表,接着运用双指针,将链表两个节点之间的指针反向,最后返回变化后的链表。
/*
struct ListNode {
int val;
struct ListNode *next;
};
*/
struct ListNode *change(struct ListNode *head){
struct ListNode *p, *q, *temp;
q = NULL;
temp = head;
p = head->next;
while(temp){
p = temp->next;
temp->next = q;
q = temp;
temp = p;
}
print(q);
return q;
}
第四题 判断回文链表
示例:
输入: 1 2 -1
输出: false
类似题目:234. 回文链表
思考:先用快慢指针判断链表的中点,之后将中点之后的链表进行反转形成一个新的链表,再对两个链表的每个结点进行判断,如果相等则指针后移,否则输出false并直接返回。
/*
struct ListNode {
int val;
struct ListNode *next;
};
*/
struct ListNode *change(struct ListNode *head){
struct ListNode *p, *q, *temp;
q = NULL;
temp = head;
p = head->next;
while(temp){
p = temp->next;
temp->next = q;
q = temp;
temp = p;
}
print(q);
return q;
}