1.1 学习内容总结
- 顺序查找法:从数组的第一个内容开始查找,直到找到要找值。
优点:写法简单易懂。
缺点:查找次数过多,面对大数据花费时间过长。 - 二分查找法:将数组排序后,从数组中间的数开始查找,当查找的数比中间的数大或者小的时候,取该数应处于的范围,再次取该范围中间的内容进行比较,直到找到正确的值。
- 数组的插入:先查找要插入的位置,后将该位置之后的元素全向后移动一位之后再将元素替换到该位置
#include<stdio.h>
int main()
{
输入要插入的数date;
输入要插入的数的位置i;
for j = n to j = i + 1;
a[j] = a[j - 1]; //将要插入数的位置之后的项的值赋予后面一项//
a[i] = date;
}
- 数组的删除
#include<stdio.h>
int main()
{
输入要删除的数据date;
for i = 0 to i < n;
for j = n to j >= i + 1;
查找要插入的数的位置i;
for j = i to j <n-1;
a[j] = a[j + 1]; //将要插入数的位置之后的项的值赋予前面一项,使该位置的的值被之后一位位置的值覆盖/
}
- 数组的排序方法:
1:选择排序法:依次查找最大的值位置,将他与被查找数组内容的第一个项给位置替换;
#include<stdio.h>
int main()
{
输入要排序的数组a[n];
for i = 0 to i < n;
{
for j = i to j < n;
{
int h = 0;
if (a[h] > a[j])
a[h] = a[j] //查找i位置之后的最小项//
}
temp = a[i];
a[i] = a[h];
a[h] = temp; //替换最小项与i位置//
}
}
2:冒泡排序法:多次查看数组,当出现前一个项比后一个项大时将该两项替换,是每次循环都能是最大的一个数移动到最末端,直到全部排序。
#include<stdio.h>
int main()
{
输入要排序的数组a[n];
for i = 0 to i < n-1;
{
for j = 0 to j < n-i-1;
{
if(a[j]>a[j+1])
temp = a[j];
a[j] = a[j+1];
a[j+!] = temp; //当出现前一项比后一项大时,替换两项位置//
}
}
}
- 数据枚举用法
调查电视节目受欢迎程度
#include<stdio.h>
#define N 9
int main()
{
int n;
int a[N];
int i, j;
for (i = 0; i < N; i++)
{
a[i] = 0;
}
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
scanf("%d", &j);
if (j<9)
{
a[j]++;
}
}
for (i = 1; i < N; i++)
{
printf("%4d%4d
", i, a[i]);
}
}
- 哈希数组用法
有重复的数据I
#include<stdio.h>
#define N 100001
int check(int n);
int main()
{
int n;
scanf("%d", &n);
if (check(n) == 1)
{
printf("YES");
}
else
{
printf("NO");
}
return 0;
}
int check(int n)
{
int static num[100001];
int i;
int x;
for (i = 1; i <= n; i++)
{
scanf("%d", &x);
if (num[x] == 1)
{
return 1;
}
else
{
num[x]=1;
}
}
return 0;
}
1.2 本章学习体会
- 数组多用在储存大数据,当面对多个数据需要保存是不需要写多个变量一一保存,节省代码量,且对数据进行排序,删除等操作也十分简便。
- 两周代码量:2500
2.1 7-5 有重复的数据I
2.1.1 伪代码
#include<stdio.h>
#define N 100001
int check(int n);
int main()
{
输入要输入的数字个数n;
if (check(n) == 1) //判段输入的数是否有重复数据//
{
printf("YES");
}
else
{
printf("NO");
}
return 0;
}
int check(int n)
{
int static num[100001];
int i;
for i=0 to i<=n
{
输入数字x;
if (num[x] == 1) //如果该数字作为下标对应的数组的值为1,则该数字以存在过//
{
return 1;
}
else
{
num[x] = 1; //如果该数字还未出现过,则将该数字作为下标对应的数组的值赋值为1,表示该数字存在过//
}
}
return 0;
}
2.1.2 代码截图
2.1.3 造测试数据
输入数字个数 | 输入数字 | 结果 |
---|---|---|
5 | 1 2 3 1 4 | YES |
10 | 10 1 7 5 6 -3 9 7 6 1 13 | YES |
5 | 1 3 5 7 9 | NO |
2.1.4 PTA提交列表及说明
原来是用两层单循环进行数据查重,由于数组的长度设定太小,调整之后分数增加一些,但最后两个测试点依旧是错的。
最后就仿照超星平台的做法改了代码。
2.2切分表达式——写个tokenizer吧
2.2.1 伪代码
#include<stdio.h>
#include<string.h>
#define H 80
int main()
{
输入字符串a[H]:
for i=0 to a[i]!='