前言
为准备大四华为笔试,决定使用学长推荐的《算法笔记》一书来学习,配套有《算法笔记·上机训练实战指南》,希望学习完此书,刷完力扣,能够通过笔试,为拿到大厂offer奠定基础💪
此文为实战系列第四篇。
我的笔记
1.问题 A: 习题6-4 有序插入
数组的输入赋值方面有问题,搜索后得知不能一大串的输入。
#include <stdio.h>
#include <string.h>
int main() {
int a[10];
int c, i;
for(i = 0; i<9; i++) {
scanf("%d", &a[i]);
}
// scanf("%d %d %d %d %d %d %d %d %d\n", &a[10]);//此处数组输入方式有误🤣
scanf("%d", &c);
a[9] = c; //注意长度为10的数组下标最多为9!!
for(i = 0; i < 10; i++) {
if(c<a[i]) {
printf("%d\n", c);
for(i; i < 9; i++) {
printf("%d\n", a[i]);
}
break; //敲代码时疑惑是否此处可以结束循环,注意break结束的是循环,if只是条件判断
}
else {
printf("%d\n", a[i]);
}
}
return 0;
}
2.杨辉三角问题
害一开始没想到用二维数组,用一维数组搞了半天,没搞成功,老是计算到a[3]时,没法得到上一行a[2]的数据,后面又定义了一个数组b[10],也没弄好;又定义了一个中间变量t,可惜耐心耗尽。。。匆匆调试不成功就放弃,去搜索答案了;在网上得到提示,使用二维数组,果然好弄了;
#include <stdio.h>
int main() {
int i, j, n;
int a[10][10] = {{1}};
scanf("%d", &n);
a[0][0] = 1; //有初始化就不用这个了
for(i = 1; i < n; i++) {
for(j = 0; j <= i; j++) {
a[i][0] = 1; //每行第一个数为1
a[i][i] = 1; //每行最后一个数为1
if(i == j)
continue; //每行最后一个数上面已经赋值了,就不参与下面的运算了
a[i][j] = a[i-1][j-1] + a[i-1][j]; //下面的数等于上面两个数的和
}
}
for(i = 0; i < n; i++) {
for(j = 0; j <= i; j++) {
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
然后,也看到了使用一维数组的代码,有再定义一个一维数组的,也有再定义两个中间变量的;可见思路没问题,心态崩了导致最后没能写出可运行的代码。
中间变量:该代码我还没完全搞明白,不知道后面两个变量运行逻辑;;对a[10]初始化为(0,1)的操作,是因为下面j是从1开始的,那么输出的也是从a[1] = 1开始,这一步可以起到使每一行第一个数为1的作用。
#include <stdio.h>
int main()
{
int i, j, n, k, t;
int a[10] = {0,1}; //用于保存一行数据
// scanf("%d",&n);
n = 4;
for( i = 1; i <= n; i++)
{
t = 0;
for( j = 1; j <= i; j++)
{
k = a[j];
a[j] = t + k; //每个数是上面两数之和
t = k;
printf("%d ", a[j]);
}
printf("\n");
}
return 0;
}
两个一维数组:
#include <stdio.h>
int main(){
int i,j,n=0,a[10]={1},b[10];
scanf("%d",&n);
for(i=0;i<n;i++) {
b[0]=a[0];
for(j=1;j<=i;j++)
b[j]=a[j-1]+a[j]; //每个数是上面两数之和
for(j=0;j<=i;j++){ //输出杨辉三角
a[j]=b[j]; //计算得的新行赋给a,用于打印和下一次计算
printf("%d ",a[j]);
}
printf("\n");
}
return 0;
}
3.问题 D: 习题6-12 解密
该题目我的输出方式选了两种但却一种能过一种过不了,显示答案错误,我自己运行显示是没问题的,不懂。
#include <stdio.h>
int main(){
char a[15];
gets(a);
for(int i = 0; i < 15; i++) {
if(a[i] >= 65&&a[i] <= 90)
a[i] = 155 - a[i];
if(a[i] >= 97&&a[i] <= 122)
a[i] = 219 - a[i];
//printf("%c", a[i]); //这种输出过不了
}
printf("%s", a);
return 0 ;
}