阶段性回顾(5)与一些题目实例(数组合并,有序判断,删除元素,进制问题等)

news2024/12/24 21:19:42

tips

1. 内存栈区的使用习惯是先使用高地址,再使用低地址。并且你还要清楚:随着数组下标的增大,其元素的地址也是在不断变高;对于一个占多个内存单元的变量进行取地址,取出来的是其所占内存空间最低地址的内存单元的地址。

2. 比如说原先已经初始化好了一个字符数组,对这个数组连续两次进行gets输入,第一次之间与第二次之间不是覆盖关系,而是当你进行第二次gets输入的时候,在这之前会把数组再次清空

3. 如果switch后面的表达式与case的标签值匹配,这个case就是入口,一旦进入之后,在没有碰到break(停止信号)之前,下面的语句流会一直执行下去。(不是所有的case都要加break)。break跳出的只是当前的switch语句(switch语句也可以嵌套)。

4. switch语句当一旦找到入口之后,如果没有出现break,那么里面的语句流就会一条一条按顺序执行下去(包括default字句)。当所有的标签都不匹配时,如果有default字句,无论它的位置在里面的哪边,都会执行这个default字句。

5. 利用辗转相除法可以求两个数的最大公因数。两个数的最大公因数与最小公倍数的乘积等于这两个数的乘积。

6. ->的优先级高于++高于--高于 . 高于* 

7. 在结构体传参的时候,要传结构体指针,而不是结构体变量,这样效率要快很多。

8. 如果在代码里面出现指针,那就肯定要进行解应用操作。解应用操作的本质就是:利用指针变量指向的地址以及其后的势力范围找到内存条里面的数据。

9. 二进制原码转到补码,补码转到原码,方法其实是一模一样的:都是符号位不变,其他的位按位取反,最后再加上1。当然了,这个是对于负数的二进制补码原码来讲,正数的二进制补码原码反码都一样。

10. 隐形整型提升都是提升到int类型的长度,即4个字节32个二进制位。

11. 

12. 

 

将数组的奇数放在前,偶数放在后

代码:

#include<stdio.h>
int main()
{
	int arr[20] = { 0 };
	int sz = 0;
	printf("请输入数组元素个数:");
	scanf("%d",&sz);
	int i = 0;
	printf("请输入数组元素:");
	for (i = 0; i < sz; i++)
	{
		scanf("%d", &arr[i]);
	}
	//
	int left = 0;
	int right = sz - 1;
	while (left<right)
	{
		//从左边找偶数
		while ((*(arr + left) % 2 == 1) && (left < right))
		{
			left++;
		}
		//从右边找奇数
		while ((*(arr + right) % 2 == 0) && (left < right))
		{
			right--;
		}
		//交换
		if (left<right)
		{
			int tmp = *(arr + left);
			*(arr + left) = *(arr + right);
			*(arr + right) = tmp;
			left++;
			right--;
		}
	}
	printf("结果为:");
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

演示结果:

 

经验总结:

1. 双指针操作是一种十分常见的技巧。
2. 在对同一个数组进行双指针操作时,务必要保证left<right.

两个有序排列的数组合并为一个有序数组

代码: 

#include <stdio.h>
int main()
{
	int arr1[20] = { 0 };
	int arr2[20] = { 0 };
	int arr3[40] = { 0 };
	int sz1 = 0;
	scanf("%d",&sz1);
	int i = 0;
	for (i = 0; i < sz1; i++)
	{
		scanf("%d", &arr1[i]);
	}
	int sz2 = 0;
	scanf("%d", &sz2);
	for (i = 0; i < sz2; i++)
	{
		scanf("%d", &arr2[i]);
	}
	//
	i = 0;
	int j = 0;
	int k = 0;
	while ((i < sz1) && (j < sz2))
	{
		if (*(arr1 + i) < *(arr2 + j))
		{
			arr3[k++] = *(arr1 + i);
			i++;
		}
		else if (*(arr1 + i) > *(arr2 + j))
		{
			arr3[k++] = *(arr2 + j);
			j++;
		}
		else
		{
			arr3[k++] = *(arr1 + i);
			arr3[k++] = *(arr2 + j);
			i++;
			j++;
		}
	}
	if (i == sz1)
	{
		for (; j < sz2; j++)
		{
			arr3[k++] = *(arr2 + j);
		}
	}
	else
	{
		for (; i < sz1; i++)
		{
			arr3[k++] = *(arr1 + i);
		}
	}
	for (i = 0; i < k; i++)
	{
		printf("%d ",arr3[i]);
	}
	return 0;
}

演示效果:

经验总结:

1. 以上就是合并两个有序数组的方法,也是采用双指针的方式,只不过这两个指针分别指向不同的数组。
2. 这个的前提是:两个数组都是有序的。

一个简易的数组是否有序判断器 

代码:

#include <stdio.h>
int main()
{
	printf("*****有序数组判断器*****\n");
	int num = 0;
	printf("请输入数组的元素个数:");
	scanf("%d",&num);
	printf("请输入数组的元素:");
	int arr[20] = { 0 };
	int i = 0;
	for (i = 0; i < num; i++)
	{
		scanf("%d", &arr[i]);
	}
	//
	int flag1 = 0;//升序
	int flag2 = 0;//降序
	printf("结果为:");
	for (i = 0; i <= (num - 2); i++)
	{
		if (*(arr + i) > *(arr + i + 1))
		{
			flag2 = 1;
		}
		else if (*(arr + i) < *(arr + i + 1))
		{
			flag1 = 1;
		}
		if (flag1 + flag2 == 2)
		{
			printf("Unsorted\n");
			break;
		}
	}
	if (flag1+flag2!=2)
	{
		if (flag1 == 1)
		{
			printf("升序的\n");
		}
		else
		{
			printf("降序的\n");
		}
	}
	return 0;
}

经验总结:

1. 有时候可以定义某一个事件为flag,然后比如说他发生了,那么flag就变为1,否则flag就是0。这样子就可以把某一个事件是否发生给它量化成0和1。

十进制整数(包括负数)与二进制补码转换器(一)

代码:

#include <stdio.h>
int main()
{
	printf("*****将一个十进制整数化为二进制数*****\n");
	while (1)
	{
		printf("输入一个十进制整数(按0退出):");
		unsigned int num = 0;
		scanf("%u",&num);
		int arr[32] = { 0 };
		int i = 0;
		if (num)
		{
			while (num)
			{
				arr[i++] = num % 2;
				num /= 2;
			}
			for (i = 31; i >= 0; i--)
			{
				printf("%d", arr[i]);
			}
			printf("\n");
		}
		else
		{
			printf("退出成功\n");
			break;
		}
	}
	return 0;
}

演示效果:

经验总结:

1. 对于一个n进制形式的数,想要得到它的每一位,就先把这个数%n,在/n去更新这个数即可。
2. 对于某一个数值的n进制表示形式下,如果要得到最后一位,你只需要把那个数%n;如果要得到除去最后一位的“那个形式”,只需要把那个数值/n即可。
3. 如果想要得到一个数的二进制,用上述的方法%2并且/2去更新数值确实没有太大的问题,但是但是,如果输入的是一个负数,那么就出现问题了,这时候要把数字类型从int改为unsigned int,使电脑对你的负数二进制补码解读发生变化。

十进制整数(包括负数)与二进制补码转换器(二)

代码: 

#include <stdio.h>
int main()
{
	printf("*****将一个十进制整数化为二进制数*****\n");
	while (1)
	{
		printf("输入一个十进制整数(按0退出):");
		int num = 0;
		scanf("%d",&num);
		int arr[32] = { 0 };
		int i = 0;
		int j = 0;
		if (num)
		{
			for (i = 0; i < 32; i++)
			{
				arr[j++] = num & 1;
				num >>= 1;
			}
			for (i = 31; i >=0; i--)
			{
				printf("%d", arr[i]);
			}
			printf("\n");
		}
		else
		{
			printf("退出成功\n");
			break;
		}
	}
	return 0;
}

经验总结:

要得到一个数的二进制表示形式的最后一位,只需要把这个数按位与1即可。受此启发,我只要把这个操作循环32次,每次循环完之后算术右移一位即可。这种方法的话不用管什么unsigned int与int之类的,因为我每次都在右移,原先那个符号位下一次循环时它就不是符号位了。

覆盖的方法删除数组中的指定元素 

代码:

#include <stdio.h>
int main()
{
	int arr[30] = { 0 };
	int num = 0;
	scanf("%d",&num);
	int i = 0;
	for (i = 0; i < num; i++)
	{
		scanf("%d",&arr[i]);
	}
	int del = 0;
	scanf("%d",&del);
	int j = 0;
	for (i = 0; i < num; i++)
	{
		if (*(arr + i) != del)
		{
			*(arr + j) = *(arr + i);
			j++;
		}
	}
	for (i = 0; i < j; i++)
	{
		printf("%d ", *(arr + i));
	}
	return 0;
}

经验总结:

这个就是用覆盖的方式来删除数组当中的指定元素,也是有点类似于双指针的感觉。不过不是从头尾两边向中间逼近,而是都是从开头开始。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/133160.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python内存机制 -- = 赋值操作

Python内存机制 python的万物皆对象可不只是说说而已。 1. 预备知识&#xff1a; id()&#xff1a;可以将id()理解为C语言中的*&#xff0c;其返回当前对象在内存中的地址。 int p id(object) # id函数返回对象object在其生命周期内位于内存中的地址&#xff0c;id函数的参数…

Python数据分析案例18——化学分子数据模型(机器学习分类问题全流程)

1. 引言 1.1设计背景 对分子进行分类&#xff0c;对于筛选特定疾病的候选药物是至关重要的。传统的机器学习算法可以对分子进行分类&#xff0c;但是分子不能直接作为机器学习模型的输入&#xff0c;需要进行大量的实验从分子中得到一系列的分子特性。将分子特征使用数字化进…

47-Jenkins-终止构建并设置构建结果

终止构建并设置构建结果前言获取构建结果终止构建并设置构建状态权限问题解决前言 本篇来学习Jenkins终止构建的方法&#xff0c;使用场景&#xff1a;根据前一个构建状态&#xff0c;判断当前构建是否运行 获取构建结果 上次构建结果&#xff1a;currentBuild.getPreviousB…

【LeetCode题目详解】(五)144.二叉树的前序遍历、94.二叉树的中序遍历、145.二叉树的后序遍历、104.二叉树的最大深度、110.平衡二叉树

目录 一、力扣第144题&#xff1a;二叉树的前序遍历 1.解题思路 2.解题代码 二、力扣第94题&#xff1a;二叉树的中序遍历 三、力扣第145题&#xff1a;二叉树的后序遍历 四、力扣第104题&#xff1a;二叉树的最大深度 1.解题思路 2.解题代码 五、力扣第110题&#xff1…

抖音直播间弹幕rpc学习

目标url 随便找个直播间即可。 https://live.douyin.com/198986091107 接口分析 首先并没有在xhr下找到对应的接口 因为采用了websocket来传输信息。切换到ws即可看到 消息下&#xff0c;可以看到16进制的数据在源源不断地增加。 那么我们只要找到反序列化后的数据&…

在wsl下开发T113的主线linux(4)-编译kernel

接下来编译kernel&#xff0c;编译过程可能会出现缺少命令的报错&#xff0c;大概是下面这几个 sudo apt update sudo apt install flex bison bc libncurses-dev 目前linux主线的最新版本并没有适配t113的相关外设驱动&#xff0c;虽然能启动并串口打印&#xff0c;但其他的…

在单选按钮上实现双击效果

如果想让你的用户体验更加极致&#xff0c;可以考虑在对话框上的单选按钮上实现双击效果&#xff0c;以此作为”选中 确定”&#xff08;或者是选中 下一页&#xff0c;或者是选中 完成等&#xff09;的快捷方式。 看看我们需要怎么做 下面是一个对话框模板以及它对应的对…

3.服务注册和远程调用-Nacos[作为注册中心]

1.SpringCloud Alibaba-Nacos[作为注册中心] Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理 平台。他是使用 java 编写。需要依赖 java 环境 Nacos 文档地址: https://nacos.io/zh-cn/docs/quick-start.html 下载 nacos-server https://…

HCIA作业整理(2022.12.29)

一、特殊的ip地址&#xff1a; 1.环回地址&#xff1a;127.0.0.1-127.255.255.254 2.受限广播地址&#xff1a;255.255.255.255 3.直接广播地址&#xff1a;主机位全为1、192.168.1.X/24 --- 192.168.1.255 4.网段&#xff1a;主机位全0 --- 192.168.1.X/24 --- 192.168.1…

STL剖析(一):体系结构概览

一.什么是STL? STL全称是Standard Template Library&#xff0c;它属于泛型编程的范畴&#xff08;泛型编程的代表性作品&#xff09;&#xff0c;泛型编程旨在编写独立于数据类型的代码&#xff0c;也就是说代码中的数据类型只有在编译的时候才会确定&#xff0c;否则为一个…

网络协议(一):基本概念、计算机之间的连接方式

网络协议系列文章 网络协议(一)&#xff1a;基本概念、计算机之间的连接方式 目录一、网络互联模型二、计算机之间的通信基础1、计算机之间的连接方式 - 网线直连2、计算机之间的连接方式 - 同轴电缆(Coaxial)3、计算机之间的连接方式 - 集线器(Hub)4、计算机之间的连接方式 -…

vue3 antd项目实战——Form表单的重置与重置【resetFields重置表单未生效(手写重置函数)】

vue3 antd项目实战——resetFields重置表单无效【手写重置函数重置表单数据】关于form表单的文章合集场景复现原因分析解决方案(手写清空函数)关于form表单的文章合集 文章内容文章链接Form表单提交和校验https://blog.csdn.net/XSL_HR/article/details/128495087?spm1001.20…

Hadoop高手之路5-MapRreduce

文章目录Hadoop高手之路5-MapReduce分布式计算框架一、MapReduce概述1.MapReduce核心思想2.MapReduce编程模型3.MapReduce编程实例——词频统计二、MapReduce的工作原理1. MapReduc的工作过程1) 分片、格式化数据源2) 执行MapTask3) 执行Shuffle4) 执行ReduceTask5) 写入文件2.…

5_虚拟机栈

虚拟机栈概述 由于跨平台性的设计&#xff0c;Java的指令都是根据栈来设计的。不同平台CPU架构不同&#xff0c;所以不能设计为基于寄存器的。 优点是跨平台&#xff0c;指令集小&#xff0c;编译器容易实现&#xff0c;缺点是性能下降&#xff0c;实现同样的功能需要更多的指…

QML教程(一)

目录 一、导入 二、对象声明 三、对象属性 1.声明对象属性 2.信号属性 3.方法属性 4.附加属性略 5.枚举属性 6.对象属性赋值 四、自定义对象 一、导入 模块导入 语法&#xff1a; import <ModuleIdentifier> [<Version.Number>] [as <Qualifier>…

【文献阅读】能源受限的无人机和移动充电站进行持续监控的稳健规划

标题&#xff1a;Robust Planning for Persistent Surveillance With Energy-Constrained UAVs and Mobile Charging Stations 作者&#xff1a;Xiaoshan Lin, Yasin Yazıcıo˘glu , and Derya Aksaray 来源&#xff1a;IEEE ROBOTICS AND AUTOMATION LETTERS 摘要 本文考虑…

DO 语句

DATA MYCLASS;SET SASHELP.CLASS;IF WEIGHT<120 THEN NOTE Normal;ELSE DO;NOTE Heavy;/* 赋值成缺失值 */WEIGHT.;END; RUN;PROC PRINT; RUN; DATA B;DO k 11 TO 0 BY -3;IF k < 5 THEN i k;ELSE i k - 1;OUTPUT;END; RUN;PROC PRINT; RUN; DO WHILE:只要条件满足&am…

Python异常处理(七)

python学习之旅(七) &#x1f44d;查看更多可以关注查看首页或点击下方专栏目录 一.什么是异常 程序运行的过程中出现了错误 定义&#xff1a;在程序运行中,检测到一个错误&#xff0c;程序中止运行并且出现了一些错误的提示,也称作BUG 例如&#xff1a;读取一个不存在的文件f…

[操作系统]进程

目录1.进程的概念2.如何管理进程3.进程的调度4.并行和并发5.进程调度需要使用的属性6.进程之间的通信7.进程和线程的区别操作系统是一个软件,对下要管理好各种硬件设备,对上要给各种软件提供稳定的运行环境.这篇博客主要讲解操作系统如何管理进程。 1.进程的概念 进程就是跑起…

Golang - 时间处理总结

Golang - 时间处理总结1 获取时间对象1.1 获取当前对象对象1.2 根据指定时间返回 time.Time 类型1.2 获取当前年月日时分秒、星期几、一年中的第几天等操作1.3 日期字符串解析成 time.Time 类型解析的时候需要特别注意时区的问题&#xff1a;2 时间对象转时间字符串3 时区4 时间…