- 陈泽文 的博客
day12总结
- @ 2024-7-26 15:12:50
总结
1:基于比较的排序时间复杂度的下限是( ) ,其中n表示待排序的元素个数。
A.
B.
C.
D.
解析:比较排序的复杂度最大为,最小为
2:计算机中的数值信息分为整数和实数(浮点数),实数之所以能够表示很大或者很小的数,是由于使用了( )。
A. 反码
B. 补码
C. 阶码
D. 较长的尾数
一个十进制数可以写成一个纯小数乘上,相似的,一个二进制可以写以成一个纯小数乘。例如:11.01=22×0.1101
一般地,任意一个二进制的数N=2j×s
补充一下:j为阶码
j如果j有正负号,则正负号为阶符
s为纯小数,叫做尾数
数符,指的是N个整数的符号
3:阅读程序
(1):
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int cnt[26];
char s[N];
int main()
{
scanf("%s", s);
int len = strlen(s);
for (int i = 0; i < len; ++i)
{
cnt[s[i] - 'a']++;
}
int maxcnt = 0, ans = 0;
for (int i = 0; i < 26; ++i)
{
if (cnt[i] > maxcnt)
{
maxcnt = cnt[i];
ans = i;
}
}
printf("%c\n%d\n", ans+'a', maxcnt);
return 0;
}
判断题
1、输入只能是小写字母。( )
√ ×
第十行有cnt[s[i]-'a'],如果输入中不含小写字母字符,那么cnt会数组越界
2、将第11行的”maxcnt = 0”改为”maxcnt = cnt[0]”代码运行结果不变。( )
√ ×
因为maxcnt一定会变成cnt[0]
3、将第12行中”i=0”改为”i=1”不会改变代码运行结果。( )
√ ×
改完后cnt[0]如果是cnt数组中的最大值则被漏掉,maxcnt就成了统计后面的最大cnt值
4、将第13行”cnt[i]>maxcnt”改为”cnt[i]>=maxcnt”不会改变程序结果。( )
√ ×
不加是找最前面的最大值,加是找最后面的最大值
选择题
5、当输入是”abcabd”时,输出为( )。
A. a 2
B. b 2
C. c 2
D. d 1
程序统计出现最多的字母已经对应出现的次数,如果多个字母出现次数相同,则选小的字母,a出现2次,b出现2次,c出现1次,d出现1次,但是a在b前面
6、将第13行”cnt[i]>maxcnt”改为”cnt[i]>=maxcnt”,当输入是”abcabd”时,输出为( )。
A. a 2
B. b 2
C. c 2
D. d 1
程序统计出现最多的字母已经对应出现的次数,如果多个字母出现次数相同,则选小的字母,a出现2次,b出现2次,c出现1次,d出现1次,但是a在b后面
(2):
#include <iostream>
using namespace std;
int main()
{
int n, x;
scanf("%d", &n);
int a[10];
for (int i = 0; i < 10; ++i) a[i] = n;
{
bool ok = true;
for (x = 1; ok; ++x)
{
int y = x;
while (y > 0)
{
if (--a[y % 10] < 0)
{
cout << x - 1<< endl; ok = false;
}
y /= 10;
}
}
}
return 0;
}
1、将第7行改为”memset(a, n, sizeof(a));” 程序运行结果不变。( )
√ ×
memset是按字节进行初始化,只有将数组元素全部初始化为0或-1或极大值时才用。
2、将第12行的”ok=false”改为”break”程序可能会进入死循环。( )
√ ×
因为break的是while循环不是for循环
3、程序可能会输出多行。( )
√ ×
有时输入一个数会输出多行因为答案的数可能会被模很多次
4、将第12行”--a[y%10] < 0”改为”a[y%10]-- < 0”程序运行结果不变。( )
√ ×
因为--x是先减再用,而x--是先用再减
选择题
5、程序输入3时,输出( )。
A. 2
B. 3
C. 10
D. 11
当x=1时,a[1]--。x=2时,a[2]--。 . . . . . .当x=11时x[1]--,然后11%10=1,a[1]--。
6、(4分)程序输入20是,输出( )。
A. 20
B. 99
C. 100
D. 101
同样用上一题的方法一个一个的试,因为我不知道怎么试,所以我就不写了
(3):
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int a[N][N], b[N][N];
int n,m,ans,trans;
int x[9] = {0,0,0,-1,-1,-1,-2,-2,-3};
int y[9] = {-1,-2,-3,0,-1,-2,0,-1,0};
int main()
{
cin>>n>>m;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
cin >> a[i][j];
}
}
b[1][1] = a[1][1];
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
int trans = INT_MIN;
for(int t=0;t<9;++t)
{
if(i+x[t]>0 && j+y[t]>0)
{
trans = max(trans,b[i+x[t]][j+y[t]]);
}
}
if (trans != INT_MIN)
{
b[i][j] = trans + a[i][j];
}
}
}
cout<<b[n][m]<<endl;
return 0;
}
1、上述代码实现了在一个n*m的数字矩形中从(1,1)到(n,m)中选择一条路径,使得其路径上方格中数字和加起来最大,每个方格选择下一个方格只能向左或者向下走一格。( )
√ ×
你告诉我九个方向坐标只能往两个方向走
2、(2分)上述代码如果删除第4行的b数组定义,并将下面的b数组全部改成a数组,运行结果不变。( )
√ ×
中的b数组是保存(1,1)到当前格子的路径最大值,a数组是格子原始值,将b替换为a后,a数组的含义变成递推过的标识路径最大值,还没有递推过的是原始值。由于递推方向是从上到下从左到右,可以保证所求上一个格子的路径都已经被递推过,不会发生混淆。
3、第20行去掉”if(trans != INT_MIN)”程序运行结果不变。( )
√ ×
会变,因为如果去掉了那么INT_MIN声明了和没声明有什么区别呢
选择题
4、上述代码的时间复杂度为( )。
A. O(n+m)
B. O(n*m)
C. O(min(n, m))
D. O(max(n, m))
两个for循环一个到n,一个到m
5、代码使用了哪种算法思想( )。
A. 贪心
B. 动态规划
C. 分治
D. 深度优先搜索
因为只有动态规划是考虑全局的
6、(4分)如果输入是
3 4
-4 -5 -10 -3
7 5 -9 3
10 -2 6 -10
输出为( )。
A. 7
B. 8
C. 9
D. 10
可以一次走两格那就是:-4 -- 7 --10 -- 6 -- -10
四:完善程序
(1):
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int n;
int instk[N], outstk[N], intop, outtop;
int stk[N], top;
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &instk[i]);
}
for (int i = 0; i < n; i++)
{
scanf("%d", &outstk[i]);
}
intop=0;
top=-1;
bool ok=true;
for (int i = 0; i < n; ++i)
{
int x = outstk[i];
if (top >= 0 && stk[top] == x) top-- ;
else
{
while ( intop < n && instk[intop] != x )
{
stk[++top] = instk[intop++];
}
if (intop>=n)
{
ok = false;
break;
}
else intop++ ;
}
}
if (ok)
{
puts("Yes");
}
else
{
puts("No");
}
return 0;
}
这个代码的作用是
1:输入一个入栈序列,再输入一个出栈序列
2:判断出栈元素是不是中间栈的首位,如果是top--,即指针指向下一位
3:如果不是,就判断在不在入栈序列里
4:如果在,则继续找下一个。
5:如果没有则继续看下一位,一直到n,ok=false
6:如果ok=false,输出no,否则输出yes
1、①处应填 ( )
A. top = 0
B. top = -1
C. outtop = 0
D. outtop = -1
初始化stk的栈顶指针为-1。
2、②处应填 ( )
A. outstk[outtop++] = x
B. instk[intop++] = x
C. top--
D. intop--
3、③处应填 ( )
A. instk[intop] != x
B. instk[intop] == x
C. intop < n && instk[intop] != x
D. instk[intop] != x && intop < n
4、④处应填 ( )
A. top > n
B. top >= n
C. intop > n
D. intop >= n
5、⑤处应填 ( )
A. intop++
B. outop++
C. top++
D. top--
(2):
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5;
int n;
using ll = long long;
int main() {
ll ans = 0, n1, n2;
int a[10], vis[10];
for (int i = 1; i < 10; i++)
{
a[i] = i ;
}
do {
for (int j = 1;j < 9; j++)
{
ll num1 = 0, num2 = 0;
for (int k = 1;k<=j; ++k)
{
num1 = num1*10 + a[k];
}
for (int k = j+1;k<=9; ++k)
{
num2 = num2*10 + a[k];
}
ll num3 = num1 * num2;
int tmp = num3, cnt = 0;
bool ok = true;
memset(vis, 0, sizeof vis);
while (num3 > 0)
{
int t = num3%10;
if( D. t == 0 || ++vis[t] > 1 ) ok = false;
num3 /= 10;
cnt++;
}
if (cnt == 9 && ok && tmp > ans)
{
ans = tmp;
n1 = num1, n2 = num2;
}
}
} while (next_permutation(a+1, a+10));
cout << n1 << "*" << n2 << "=" << ans << endl;
return 0;
}
这个代码的作用是:
1:保存1到9,9个数字
2:枚举乘号的位置,乘号有八个位置
3:然后判断num3是否只有1-9这9个数字,并且只出现一次
4:用next_permutation函数求下一个排列
1、①处应填 ( )
A. a[i] = 0
B. vis[i] = 0
C. a[i] = i
D. vis[i] = i
2、②处应填 ( )
A. j < 10
B. j < 9
C. j <= 10
D. a[j] > 0
3、③处应填 ( )
A. vis[t] > 1
B. ++vis[t] > 1
C. t == 0 && ++vis[t] > 1
D. t == 0 || ++vis[t] > 1
4、④处应填 ( )
A. cnt == 9
B. cnt ==9 && ok
C. cnt == 9 && ok && num3>ans
D. cnt == 9 && ok && tmp > ans
5、⑤处应填 ( )
A. next_permutation(a+1, a+10)
B. next_permutation(a, a+10)
C. next_permutation(a, a+9)
D. next_permuttion(a+1, a+9)
数据结构专题
1:如果树根算第1层,那么一棵n层的二叉树最多有( )个结点
A.
B.
C.
D.
4:在使用高级语言编写程序时,一般提到的“空间复杂度”中的“空间”是指( )。
A.程序运行时理论上所占的内存空间
B.程序运行时理论上所占的数组空间
C.程序运行时理论上所占的硬盘空间
D.程序源文件理论上所占的硬盘空间
5:向一个栈顶指针为 hs 的链式栈中插入一个指针 s 指向的结点时,应执行()
A.hs->next = s;
B.s->next = hs; hs = s;
C.s->next = hs->next; hs->next = s;
D.s->next = hs; hs = hs->next;
8:11. 双向链表中有两个指针域llink和rlink,分别指向该结点的前驱及后继。设p指向链表中的一个结点,它的左右结点均非空。现要求删除结点p,则下面语句序列中错误的是( )。
A. p->rlink->llink = p->rlink;
p->llink->rlink = p->llink; delete p;
B. p->llink->rlink = p->rlink;
p->rlink->llink = p->llink; delete p;
C. p->rlink->llink = p->llink;
p->rlink->llink->rlink = p->rlink; delete p;
D. p->llink->rlink = p->rlink;
p->llink->rlink->llink = p->llink; delete p;
- 以下哪个排序是稳定的( )
A. 冒泡
B.选择
C.插入
D.快排
E.堆排序
F.希尔排序