C语言好好题(一维数组)

news2025/1/18 9:57:44

两天没有更新了,贴纸们,有没有想我呀。😄😄😄

好了,就寒暄到这里吧,下面请看题:

有序序列判断

输入一个整数序列,判断是否是有序序列,有序,指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序

输入描述:

第一行输入一个整数N(3≤N≤50)。

第二行输入N个整数,用空格分隔N个整数。

输出描述:

输出为一行,如果序列有序输出sorted,否则输出unsorted。

判断是否为有序序列,可能是升序还可能是降序,所以我们就可以设计一个函数来判断是不是有序序列,那么我们怎么实现呢?首先我们假设是升序的,那么我们就以这个条件进去,然后以某一个值为有序状态,然后我们再里面进行判断,如果有相反情况,那么我们就改变刚才假设有序状态的值,改为无序状态。之后我们再在主函数中,根据返回的值进行判断有序还是无序!:

int sort(int arr[], int n)
{
	
	if (arr[0] >= arr[1])
	{
			int flag = 0;//假设flag为0的时候为有序状态
			for (int j = 0; j < n - 1; j++)
			{
				if (arr[j] < arr[j + 1])
				{
					flag = 1;//因为我们前面假设的是升序,这里前一位大于后一位的话,就不是有序                
                             //  状态了,那么此时我们就变为无序状态
				}
			}
			return flag;
	}
	else 
	{
		int flag = 0;
		for (int j = 0; j < n - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				flag = 1;
			}
		}
		return flag;
	}
}

主函数里,我们就很好写了:

int sort(int arr[], int n)
{
	
	if (arr[0] >= arr[1])
	{
			int flag = 0;
			for (int j = 0; j < n - 1; j++)
			{
				if (arr[j] < arr[j + 1])
				{
					flag = 1;
				}
			}
			return flag;
	}
	else 
	{
		int flag = 0;
		for (int j = 0; j < n - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				flag = 1;
			}
		}
		return flag;
	}
}

int main()
{
	int n = 0;
	scanf("%d", &n);

	int arr[50];
	for (int i = 0; i < n; i++)
	{
		scanf("%d",&arr[i]);
	}

	int ret = sort(arr, n);//根据返回的值进行判断是否有序
	if (ret == 1)
	{
		printf("unsorted");
	}
	else
	{
		printf("sorted");
	}

	return 0;
}

我们来看看运行结果:


有序序列插入一个整数

有一个有序数字序列,从小到大排序,将一个新输入的数插入到序列中,保证插入新数后,序列仍然是升序。

输入描述:

第一行输入一个整数N(0≤N≤50)。

第二行输入N个升序排列的整数,输入用空格分隔的N个整数。

第三行输入想要进行插入的一个整数。

输出描述:

输出为一行,N+1个有序排列的整数。

插入一个数到升序序列中,而且保证插入后还是一个升序序列!怎么想这道题呢?这里的要求是插入一个数,那么我们一个数有一个数的做法,有一些是两个有序序列进行排序!那么我们很容易想到用这个数字与这个序列进行比较,如果小于这个数,那么我们就打印我们的原序列的数,如果大于我们这个数,那我们此时就是打印我们的目标数,那么现在我们就以这个思路去实现我们的代码:

int main()
{
	int n = 0;
	scanf("%d", &n);

	int arr[50];
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}

	int num = 0;
	scanf("%d", &num);

	
	for (int i = 0; i < n; i++)
	{

		if (arr[i] < num)
		{
			printf("%d ", arr[i]);
		}
		else
		{
			printf("%d ", num);
		}	
	}


	return 0;
}

此时我们来看看运行的结果:

 我们根据运行的结果可以看出,当我们找到插入数的位置后,我们之后的数都是打印的是我们的插入的那个数。那么此时我们可以想,那当我们的插入数插到属于它自己的位置时,此时我们就不回去循环了。我们可以重新写一个循环呀,打印原序列后面的数不就好了嘛,我们打印完后,我们就跳出整个循环!:

int main()
{
	int n = 0;
	scanf("%d", &n);

	int arr[50];
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}

	int num = 0;
	scanf("%d", &num);

	
	for (int i = 0; i < n + 1; i++)//因为我们插入了一个数,所以多了一次循环
	{

		if (arr[i] < num)
		{
			printf("%d ", arr[i]);
		}
		else
		{
			printf("%d ", num);//因为是插入一个,所以我们就打印之后的序列的数就好了。
			for (int j = i; j < n; j++)
			{
				printf("%d ", arr[j]);
			}
			break;//打印完后跳出整个循环就over了!
		}
	}


	return 0;
}

 我们来看看此时的运行结果:


序列中删除指定数字

有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置没有发生改变。

输入描述:

第一行输入一个整数(0≤N≤50)。

第二行输入N个整数,输入用空格分隔的N个整数。

第三行输入想要进行删除的一个整数。

输出描述:

输出为一行,删除指定数字之后的序列。

序列中删除指定的数字,而且可能序列中有相同的整数,那么也可能是相邻的相同的数。那么我们还是要与序列中的数进行比较,如果不相同的话,那么我们就打印出序列中的数。如果相同的话,我们就删除序列中的数:

int main()
{
	int n = 0;
	scanf("%d", &n);

	int arr[50];
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}

	int num = 0;
	scanf("%d", &num);

	for (int i = 0; i < n; i++)
	{
		if (arr[i] > num || arr[i]<num)
		{
			printf("%d ", arr[i]);
		}	
		else
		{
			
		}
	}
	return 0;
}

此时我们的问题是怎样删除我们的数,那我们可以由后面一位数来替代该位需要删除的数:

arr[i] = arr[i + 1];

而且还要注意可能有相邻的相同的数!那么我们在序列中的数与该数相同时我们是不是还应该弄一个循环,判断是否有相邻的相同数,直到不相等了,我们才跳出去!

while (arr[i] == arr[i + 1])
{
	arr[i] = arr[i + 1];
	i++;
}

我们来看看整体的代码:

int main()
{
	int n = 0;
	scanf("%d", &n);

	int arr[50];
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}

	int num = 0;
	scanf("%d", &num);

	for (int i = 0; i < n; i++)
	{
		if (arr[i] > num || arr[i]<num)
		{
			printf("%d ", arr[i]);
		}	
		else
		{
			while (arr[i] == arr[i + 1])
			{
				arr[i] = arr[i + 1];
				i++;
			}
			
		}
	}
	return 0;
}

我们来看看运行的结果:

 我们来梳理一下该过程:假设序列不等于要删除的数,我们就直接打印该序列中的数就可以了,如果等于该序列的数,我们先判断有没有相邻的相同的数,如果没有,那么我们就不用执行,这一位就不用打印,就直接跳到上面for循环给i++,跳到下一位进行判断!如果有相邻相同的,我们就进入while循环,把后一位的值赋值给前一位,然后i++,直到不相等为止!假设我们有两位相邻的,那么我们的while循环就执行了一次,i就加了一次,然后到上面for循环处还要加一次,总共加了我们的两次,就是跳过我们的这两位咯,你懂了吗?学会了?还是学废了?哈哈,如果还是不太懂的话,可以自己去调试哦!


序列中整数去重

输入n个整数的序列,要求对这个序列进行去重操作。所谓去重,是指对这个序列中每个重复出现的整数,只保留该数第一次出现的位置,删除其余位置。

输入描述:

输入包含两行,第一行包含一个正整数n(1 ≤ n ≤ 1000),表示第二行序列中数字的个数;第二行包含n个整数(范围1~5000),用空格分隔。

输入描述:

输出为一行,按照输入的顺序输出去重之后的数字,用空格分隔。

序列中整数的去重,且保留该数第一次出现的位置。哇,这题是一道比一道变态啊!😵😵😵

既然序列中的每一个元素都要去看的话,那么我们就拿出第一位去和后面的每一位进行比较,看看后面有没有,如果有那么我们就删除或者向上面那样的跳过,第一位比较完后,我们接着要拿出第二位去与后面的进行比较了,既然怎样的话,那么我们还是可以写出下面的代码的:

int main()
{
	int n = 0;
	scanf("%d", &n);

	int arr[1000];
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}

	for (int i = 0; i < n; i++)
	{
		for (int j = i+1; j < n; j++)
		{
			if (arr[i] == arr[j])
			{
				//待思考的内容
			}
		}
	}


	return 0;
}

既然它要删除的话,那就是我们的跳过或者移位,如果跳过的话,那么我们再双重循环里面又该怎样打印?那么我们就先选择一位看看,把后面的那一位移到这一位来,就把后面的整体像前面移一位。移动完后,我们再接着从后面一位进行排查,如果还有我们又接着移,直到排查完毕!这个思路好像可以勒哈。那么我们移动一整次,是不是我们的n就要减少一次呢,因为我们移动了之后就会减少一位嘛,所以n应该减减。但是我们此时还要注意一个问题,我们的j也应该减减,因为再我们下一次判断下一位时,是从删除那位的位置开始排查着走的,因为我们到上面for循环去的话,j还要加加,所以我们这里j还要减减!

int main()
{
	int n = 0;
	scanf("%d", &n);

	int arr[1000];
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}

	for (int i = 0; i < n; i++)
	{
		for (int j = i+1; j < n; j++)
		{
			if (arr[i] == arr[j])
			{
				for (int a = j; a < n - 1; a++)
				{
					arr[a] = arr[a + 1];
				}
				n--;
				j--;
			}
		}
	}

	for (int i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}

我们来看看运行结果:

 今天就到这里了,拜拜了,好梦!

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

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

相关文章

Java基础(程序控制结构篇)

Java的程序控制结构与C语言一致&#xff0c;分为顺序结构、选择结构&#xff08;分支结构&#xff09;和循环结构三种。 一、顺序结构 如果程序不包含选择结构或是循环结构&#xff0c;那么程序中的语句就是顺序的逐条执行&#xff0c;这就是顺序结构。 import java.util.Sc…

iperf3 网络测试

iperf3 测试网络的上下行带宽 下载地址 https://iperf.fr/iperf-download.php 开启服务器 开启客户端 常用命令 -c 代表客户端-s 代表服务端-u 代表 udp-r 代表数据方向是否反向 https://baijiahao.baidu.com/s?id1731514357681464971&wfrspider&forpc

c语言-操作符详解(含优先级与结合性)

文章目录 了解什么是操作数、操作符操作数&#xff1a;操作符 操作符详解&#xff1a;1.算术操作符&#xff1a; 、- 、* 、/ 、%2.移位操作符: << >>3.位操作符: & | ^4. 赋值操作符: 、 、 - 、 * 、 / 、% 、<< 、>> 、& 、| 、^5. 单⽬操…

移动机器人,开启智能柔性制造新篇章

智能制造是当今工业发展的必然趋势&#xff0c;而柔性制造则是智能制造的重要组成部分。在这个快速变革的时代&#xff0c;如何提高生产效率、降低成本、增强灵活性成为了制造业的关键挑战。富唯智能移动机器人应运而生&#xff0c;为柔性制造注入了新的活力。 基于富唯智能AI-…

xss-labs靶场6-10关

文章目录 前言一、靶场6-10关1、关卡62、关卡73、关卡84、关卡95、关卡10 总结 前言 此文章只用于学习和反思巩固xss攻击知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随意去尚未授权的网站做渗透测试&#xff01;&#xff01;&#xff01; …

xilinx zynq平台 elf文件到bin文件格式转化

在嵌入式实际开发过程中&#xff0c;因为系统资源有限&#xff0c;需要尽可能的节省资源&#xff0c;尤其是flash资源。在某些场景下&#xff0c;需要直接执行占用内存较小的bin文件&#xff0c;而非elf文件。但xilinx SDK编译的输出文件一般为elf文件&#xff0c;所以需要进行…

国际版Amazon Lightsail的功能解析

Amazon Lightsail是一项易于使用的云服务,可为您提供部署应用程序或网站所需的一切,从而实现经济高效且易于理解的月度计划。它是部署简单的工作负载、网站或开始使用亚马逊云科技的理想选择。 作为 AWS 免费套餐的一部分&#xff0c;可以免费开始使用 Amazon Lightsail。注册…

【Delphi】使用TWebBrowser执行JavaScript命令传入JSON参数执行出错解决方案

目录 一、问题背景&#xff1a; 二、实际示例&#xff1a; 三、解决方案&#xff1a; 1. Delphi 代码&#xff1a; 2. javaScript代码&#xff1a; 一、问题背景&#xff1a; 在用Delphi开发程序&#xff0c;无论是移动端还是PC端&#xff0c;都可以很方便的使用TWebBrows…

LongAccumulator

原子操作之LongAccumulator 和LongAdder的区别在于&#xff0c;LongAdder是在Cell里面只能做加减操作&#xff0c;不能乘除&#xff0c;而LongAccumulator就可以定义乘除操作。原理和LongAdder都是一样的&#xff0c;一个Base和一个Cells数组。 原文跳转地址

Java游戏之飞翔的小鸟

前言 飞翔的小鸟 小游戏 可以作为 java入门阶段的收尾作品 &#xff1b; 需要掌握 面向对象的使用以及了解 多线程&#xff0c;IO流&#xff0c;异常处理&#xff0c;一些java基础等相关知识。一 、游戏分析 1. 分析游戏逻辑 &#xff08;1&#xff09;先让窗口显示出来&#x…

51单片机按键控制LED灯亮灭的N个玩法

51单片机按键控制LED灯亮灭的N个玩法 1.概述 这篇文章介绍按键的使用&#xff0c;以及通过控制LED灯的小实验&#xff0c;发现按键中存在的问题&#xff0c;然后思考并解决这些问题。达到熟练使用按键控制元器件。 2.搭建硬件环境 1.硬件准备 名称型号数量单片机STC12C205…

【办公常识】写好的代码如何上传?使用svn commit

首先找到对应的目录 找到文件之后点击SVN Commit

如何做好项目管理?年薪百万项目大佬一直在用这11张图

大家好&#xff0c;我是老原。 日常工作中&#xff0c;我们会遇到各种大大小小的工作项目&#xff0c;如何能让项目保质保量的完成&#xff0c;是我们项目经理的目标。 项目管理的流程可以说是由一系列的子过程组成的&#xff0c;它是一个循序渐进的过程&#xff0c;所以不能…

排序算法-----快速排序(非递归实现)

目录 前言 快速排序 基本思路 非递归代码实现 前言 很久没跟新数据结构与算法这一栏了&#xff0c;因为数据结构与算法基本上都发布完了&#xff0c;哈哈&#xff0c;那今天我就把前面排序算法那一块的快速排序完善一下&#xff0c;前面只发布了快速排序递归算法&#xff0c;…

智能合约安全漏洞与解决方案

// SPDX-License-Identifier: MIT pragma solidity ^0.7.0;import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.3/contracts/math/SafeMath.sol";/*智能合约安全在智能合约中安全问题是一个头等大事&#xff0c;因为智能合约不像其他语…

LeetCode 2304. 网格中的最小路径代价:DP

【LetMeFly】2304.网格中的最小路径代价&#xff1a;DP 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-path-cost-in-a-grid/ 给你一个下标从 0 开始的整数矩阵 grid &#xff0c;矩阵大小为 m x n &#xff0c;由从 0 到 m * n - 1 的不同整数组成。你可以…

网工内推 | 合资公司网工,CCNP/HCIP认证优先,朝九晚六

01 中企网络通信技术有限公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、按照工作流程和指引监控网络运行情况和客户连接状况&#xff1b; 2、确保各监控系统能正常运作&#xff1b; 3、快速响应各个网络告警事件&#xff1b; 4、判断出网络故障&#xff0c;按…

【LeetCode刷题】--39.组合总和

39.组合总和 本题详解&#xff1a;回溯算法剪枝 class Solution {public List<List<Integer>> combinationSum(int[] candidates, int target) {int len candidates.length;List<List<Integer>> res new ArrayList<>();if (len 0) {return r…

栈和队列【详解】

目录 一、栈 1.栈的定义 2.栈的初始化 3.入栈 4.出栈 5.获取栈顶元素 6.获取栈元素的个数 7.判断栈是否为空 8.销毁栈 二、队列 1.队列的定义 2.入队 3.出队 4.获取队头元素 5.获取队尾元素 6.判断队列是否为空 7.获取队列的元素个数 8.销毁队列 前言&#xf…

基于天鹰算法优化概率神经网络PNN的分类预测 - 附代码

基于天鹰算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于天鹰算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于天鹰优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…