C语言:杨氏矩阵、杨氏三角、单身狗1与单身狗2

news2024/9/21 18:42:03

下面介绍四道题目和解法


1.杨氏矩阵

算法:右上角计算

题目:有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。

要求:时间复杂度小于O(N);

代码:

#include<stdio.h>
int Find_arr(int arr[3][3],int r, int c, int k)
{
	int x = 0;
	int y = c - 1;
	while (x<r&&y>=0)
	{
		if (arr[x][y] < k)
		{
			x++;
		}
		else if (arr[x][y] > k)
		{
			y--;
		}
		else
			return 1;
	}
	return 0;
}

int main()
{
	int arr[3][3] = {1,2,3,4,5,6,7,8,9};
	int k = 0;
	printf("输入需要查找的数字:");
	scanf("%d",&k);
	int ret = 0;
	ret=Find_arr(arr,3,3,k);
	if (ret == 1)
		printf("找到了\n");
	else
		printf("找不到\n");

	return 0;
}

 【关键代码部分解析】

杨氏矩阵的特点:矩阵的每行从左到右是递增的,矩阵从上到下是递增的

代码思路:从右上角或者左下角开始遍历,我们这里从右上角开始

假设要找的值是5

第一次遍历:与右上角的元素比较,也就是与3比较。

第二次遍历:与4比较。

第三次遍历:与5比较,相等,得出结果。

【第二种代码】 

要求找到了并且返回该元素的下标:

返回双参数代码写法:

#include<stdio.h>
#include<assert.h>
int Find_arr(int arr[3][3], int* px, int* py, int k)
{
	assert(px&&py);
	int x = 0;
	int y = *py-1;
	while (x<*px&&*py>=0)
	{
		if (arr[x][y] < k)
		{
			x++;
		}
		else if (arr[x][y] > k)
		{
			y--;
		}
		else
		{
			*px = x;
			*py = y;
			return 1;
		}
			
	}
	*px = -1;
	*py = -1;
	return 0;
}

int main()
{
	int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
	int k = 0;
	printf("输入需要查找的数字:");
	scanf("%d", &k);
	int ret = 0;
	int x = 3;
	int y = 3;
	ret = Find_arr(arr, &x,&y, k);
	if (ret == 1)
	{
		printf("找到了\n");
		printf("下标是:%d %d\n", x, y);
	}
	else
	{
		printf("找不到\n");
		printf("下标是:%d %d\n", x, y);

	}
	return 0;
}

返回双参数思路:

将下标的地址作为参数,不需要返回两个下标即可达到带回参数的目的。

2.杨辉三角

我们想要打印出下面的图案,并且符号性质,需要怎么做呢?

(1)图形讲解

我们可以创建一个二维数组,刚开始都赋值0。

然后可以打印出下半部分就行。

代码:

#include<stdio.h>
int main()
{
	int arr[10][10] = { 0 };//创建二维数组并初始化成0
	//打印下半部分
	int i = 0;
	for (i=0;i<10;i++)
	{
		int j = 0;
		for (j=0;j<=i;j++)//打印三角形的关键
		{
			printf("%d ",arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

运行结果:

(2)赋值讲解

现在知道了杨辉三角的形状是怎么样打印出来的,接下来需要对其赋值,成为真正的杨辉三角。

杨辉三角:从第三行和第二列开始,每个数字的值=其上方的数字+左上角的数字 (空白的默认为0),其他部分默认赋值1。

代码: 

#include<stdio.h>
int main()
{
	int arr[10][10] = { 0 };//创建二维数组并初始化成0
	//对杨辉三角赋值(二维数组)
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		int j = 0;
		for (j = 0; j <= i; j++)
		{
			if (j == 0 || i == j)
				arr[i][j] = 1;
			if (i >= 2 && j >= 1)//第三行和第二列开始
				//关系
				arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
		}

	}

	//打印下半部分
	i = 0;
	for (i=0;i<10;i++)
	{
		int j = 0;
		for (j=0;j<=i;j++)//打印三角形的关键
		{
			printf("%5d ",arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

运行结果:

赋值解析: 

 其实这就是杨辉三角了,要是打出类似等腰三角形的性质,则需要控制打印的格式,属于打印的知识,这里暂时不介绍

等腰三角的杨辉三角:暂时不做解析

#include<stdio.h>

int main()
{
	int arr[10][10] = { 0 };
	//初始化
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		int j = 0;
		for (j = 0; j <= i; j++)
		{
			if (j == 0 || i == j)
				arr[i][j] = 1;
			if (i >= 2 && j >= 1)//第三行和第二列开始
				arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
		}

	}
	//打印
	i = 0;
	int k = 10;
	for (i = 0; i < 10; i++)
	{
		for (int k = 0; k < 26 - (6 * i / 2); k++)//打印一行前面的空格
		{
			printf(" ");
		}
		int j = 0;
		for (j = 0; j <= i; j++)
		{

			printf("%5d ", arr[i][j]);
		}

		printf("\n");
	}
	return 0;
}

运行结果:

3.单身狗1

题目:一个数组中只有一个数字单独出现,其他的数字都成对出现,请找出这个单身狗

如:1,2,3,4,5,1,2,3,4,只有5只出现了一次,所以需要找出5

【思路】

(1)利用异或操作符^:(二进制对应位)相同为0,相异为1。

(2)如:a^a=0,a^0=0。

(3)并且支持交换律,所以我们可以将所有的数据和0异或在一起,最终的结果就是“单身狗”。

代码解法:

#include<stdio.h>
int Find_dog_arr(int arr[],int sz)
{
	int tmp = 0;
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		tmp = tmp ^ arr[i];//全部异或在一起
	}
	return tmp;
}
int main()
{
	int arr[] = { 1,2,3,4,5,1,2,3,4 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int ret=Find_dog_arr(arr,sz);
	printf("%d\n",ret);
	return 0;
}

 tmp的最终结果就是5。

4.单身狗2

题目:

一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。

编写一个函数找出这两个只出现一次的数字。

例如:

有数组的元素是:1,2,3,4,5,1,2,3,4,6

只有5和6只出现1次,要找出5和6。

【思路】

(1)这是单身狗1的升级版,显然直接异或是不行的。

(2)所以我们可以先进行分类,将两个单身狗分在两个不同的组,再进行异或操作。

(3)怎么分类:找出分类依据。

   利用异或操作分类,将所有数字异或起来的结果其实就是两个单身狗异或起来的结果;再根据结果的二进制,也就是根据某一位二进制是否为1进行分类。(两个单身狗肯定有不同的二进制位,结果肯定为1)

【分类操作】

void Find_dog2_arr(int arr[], int sz, int* p1, int* p2)
{
	int tmp = 0;
	int i = 0;
	//1.全部异或在一起,结果为两个单身狗异或在一起的结果
	for (i = 0; i < sz; i++)
	{
		tmp ^= arr[i];
	}
	//2.找出分组的依据
	i = 0;
	int r = 0;
	for (i = 0; i < 32; i++)
	{
		r = arr[i];
		if ((tmp >> i) & 1 == 1)
		{
			r = i;
		}
	}
}

(1)tmp是两个单身狗异或在一起的结果

(2)(tmp>>i)&1==1的意思是找出tmp的二进制位为1的位,也就是分组的关键

【思路刨析】

【整体代码】

#include<stdio.h>
void Find_dog2_arr(int arr[], int sz, int* p1, int* p2)
{
	int tmp = 0;
	int i = 0;
	//1.全部异或在一起,结果为两个单身狗异或在一起的结果
	for (i = 0; i < sz; i++)
	{
		tmp ^= arr[i];
	}
	//2.找出分组的依据
	i = 0;
	int r = 0;
	for (i = 0; i < 32; i++)
	{
		r = arr[i];
		if ((tmp >> i) & 1 == 1)
		{
			r = i;
		}
	}
	//3.分组
	int u1 = 0;
	int u2 = 0;
	for (i = 0; i < sz; i++)
	{
		if ((arr[i] >> r) & 1 == 1)//按位与
		{
			u1 ^= arr[i];
		}
		else
		{
			u2 ^= arr[i];
		}
	}
	*p1 = u1;
	*p2 = u2;
}
int main()
{
	int arr[] = { 1,2,3,4,5,1,2,3,4,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int s1 = 0;
	int s2 = 0;
	Find_dog2_arr(arr, sz, &s1, &s2);
	printf("单身狗1:%d\n单身狗2:%d", s1, s2);
	return 0;
}

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

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

相关文章

react笔记基础部分(组件生命周期路由)

注意点&#xff1a; class是一个关键字&#xff0c; 类。 所以react 写class, 用classname &#xff0c;会自动编译替换class 点击方法&#xff1a; <button onClick {this.sendData}>给父元素传值</button>常用的插件&#xff1a; 需要引入才能使用的&#xf…

ubuntu执行普通用户或root用户执行apt-get update时报错Couldn‘t create temporary file /tmp/...

apt-get update无法更新&#xff0c;报错&#xff1a; Couldnt create temporary file /tmp/apt.conf.GSzv74 for passing config to&#xff0c;&#xff0c;&#xff0c; 这是由于/tmp目录没有权限导致的&#xff0c;解决办法&#xff1a; chmod 777 /tmp

额定电压输出电流:电源性能测试指标之一

额定电压和额定电流是电源设计生产时需要考虑的两个重要参数&#xff0c;额定电压是电源输出的电压标准&#xff0c;额定电流是电源能够提供的最大电流容量。这两个参数是评估电源性能的重要指标之一&#xff0c;指导着电气设备的正常工作运行。 额定电压输出电流测试方法 额定…

上门家政维修多城市代理多商户师傅入驻小程序开源版开发

上门家政维修多城市代理多商户师傅入驻小程序开源版开发 用户登录/注册&#xff1a;用户可以使用手机号或第三方账号登录或注册小程序。 服务分类&#xff1a;在主页上显示不同的服务分类&#xff0c;例如电器维修、家具拆装、管道疏通、清洁保洁等。 城市选择&#xff1a;用…

C++反转链表递归

文章目录 题目描述解题思路代码复杂度分析 题目描述 LCR 024. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 给定单链表的头节点 head &#xff0c;请反转链表&#xff0c;并返回反转后的链表的头节点。 解题思路 这里我们采用递归的思路来解决首先我们分为两个视角来查看…

竞赛选题 深度学习卫星遥感图像检测与识别 -opencv python 目标检测

文章目录 0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **深度学习卫星遥感图像检测与识别 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐…

超好用的数据可视化工具推荐,小白也适用!

Excel、Tableau……可以做数据可视化的工具不少&#xff0c;但简单、好用又高效&#xff0c;甚至连无SQL基础的小白也能轻松使用的就真没几个。奥威BI数据可视化工具是少有的操作难度低、成本支出低、灵活自助分析能力强的BI工具。 1、操作难度低 奥威BI数据可视化工具的操作…

图片放大镜效果

安装&#xff1a; vueuse 插件 npm i vueuse/core 搜索&#xff1a; useMouseInElement 方法 <template><div ref"target"><h1>Hello world</h1></div> </template><script> import { ref } from vue import { useM…

图纸管理制度《三》

一、目的和使用范围 为了更好的规范设备及设计图纸的保管、发放和使用&#xff0c;根据业主仅提供四套图纸的实际情况&#xff0c;本着施工图纸服务施工的第一原则&#xff0c;合理利用有限的图纸资源&#xff0c;将《管理制度汇编》中的图纸管理制度进行细化&#xff0c;制定本…

视频与png图片批量分类技巧:轻松管理文件

在我们的日常工作中&#xff0c;经常会遇到需要处理大量文件的情况&#xff0c;其中就包括视频和png图片。这些文件数量繁多&#xff0c;如果一个个手动分类&#xff0c;不仅耗时而且容易出错。因此&#xff0c;掌握批量分类技巧成为了高效管理文件的关键。本文将为您运用云炫文…

地面文物古迹保护方案,用科技为文物古迹撑起“智慧伞”

一、行业背景 当前&#xff0c;文物保护单位的安防系统现状存在各种管理弊端&#xff0c;安防系统没有统一的平台&#xff0c;系统功能不足、建设标准不同&#xff0c;产品和技术多样&#xff0c;导致各系统独立&#xff0c;无法联动&#xff0c;形成了“信息孤岛”。地面文物…

64从零开始学Java之关于日期时间的新特性

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在上一篇文章中&#xff0c;壹哥给大家讲解了Java里的格式化问题&#xff0c;这样我们就可以个性化设…

《排错》Python重新安装后,执行yum命令报错

安装完新的python以后&#xff0c;发现yum命令没法用 以下是报错信息&#xff1a; [rootmaster ~]# yum There was a problem importing one of the Python modules required to run yum. The error leading to this problem was:No module named yumPlease install a packag…

ResNet中文翻译(Deep Residual Learning for Image Recognition)

Deep Residual Learning for Image Recognition 用于图像识别的深度残差学习 原文&#xff1a;https://arxiv.org/abs/1512.03385 摘要 更深层次的神经网络更难训练。我们提出了一个残差学习框架&#xff0c;以简化比以前使用的网络更深的网络训练。我们明确地将层重新表示为参…

考研专业课程管理系统 JAVA开源项目 毕业设计

1. 项目介绍 基于JAVAVueSpringBootMySQL 的考研专业课程管理系统&#xff0c;包含了考研课程、考研专业、考研注册、考研院校和高校教师模块&#xff0c;还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块&…

React 图片瀑布流

思路&#xff1a; 根据浏览器宽度&#xff0c;确定列数&#xff0c;请求的图片列表数据是列数的10倍&#xff0c;按列数取数据渲染 Index.js: import React from react import { connect } from react-redux import { withRouter } from react-router-dom import { SinglePag…

22 行为型模式-状态模式

1 状态模式介绍 2 状态模式结构 3 状态模式实现 代码示例 //抽象状态接口 public interface State {//声明抽象方法,不同具体状态类可以有不同实现void handle(Context context); }

PyQt5入门4——给目标检测算法构建一个简单的界面

PyQt5入门4——给目标检测算法构建一个简单的界面 学习前言要构建怎么样的界面实例使用1、窗口构建a、按钮&#xff1a;获取图片b、Inputs、Outputs文本提示c、Inputs、Outputs图片显示d、箭头显示e、整点祝福 2、主程序运行 全部代码 学习前言 搞搞可视化界面哈&#xff0c;虽…

外汇天眼:CySEC向塞浦路斯投资公司的董事会成员发出警告

塞浦路斯证券与交易委员会&#xff08;CySEC&#xff09;已警告塞浦路斯投资公司&#xff08;CIFs&#xff09;的董事会成员&#xff0c;提醒他们加强履行职责&#xff0c;推动诚信和高道德标准的文化&#xff0c;此前监管行动揭示了合规方面的差距。 CySEC已经在加强监管措施…

国产破局、引领三维未来 | 大势智慧2023秋季新品发布会来了!

国产破局、引领三维未来 全国产、真安全 大势智慧2023秋季新品发布会 10.27 | 14:30 扫码预约 敬请期待 #实景三维##三维重建##国产替代##新品发布# ​​​