《算法笔记》实战笔记——2.5数组(习题6-4 有序插入、问题 C: 习题6-6 杨辉三角、问题 D: 习题6-12 解密)

前言 

        为准备大四华为笔试,决定使用学长推荐的《算法笔记》一书来学习,配套有《算法笔记·上机训练实战指南》,希望学习完此书,刷完力扣,能够通过笔试,为拿到大厂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 ;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值