C语言学习(二)
今天在程序员面试题中,碰到一个有意思的题目:数组a[N],存放了1至N-1个数,其中某个数重复一次,现在要求找出重复的数字且程序时间复杂度必须为O(N)。乍一看,如果不计时间复杂度和空间复杂度程序比较容易编写,但是考虑时间和空间复杂度,笔者首先想到的是用“哨兵”的经典方法。程序如下:
/************************************************************************/
/* 功能:数组a[N],存放了1至N-1个数其中某个数重复一次,找出被重复的数字.时间复杂度必须为o(N)
/* 作者:ZL
/* 日期:2018-04-08 14:38
/************************************************************************/ #include <stdio.h> int do_dup(int a[],int n); int main(void)
{
int a[]={,,,,};
int data=;
int n=;
int i;
data=do_dup(a,n);
printf("data=%d\n",data);
for (i=;i<;i++)
{
printf("%d\n",a[i]);
} } int do_dup(int a[],int n)
{
int temp;
while(a[]!=a[a[]]) //a[0] 用作“哨兵”
{
temp=a[];
a[]=a[temp];
a[temp]=temp;
}
return a[]; }
程序在VC++6.0运行的结果如下图所示:

从结果中可以看出找到了数组重复数字,时间复杂也为O(N),却改变了数组原本的值,所以程序还需要改进,笔者借鉴网友提供的思路,用数学中假金条思想,将1到N-1个数看做是重量不同的金条,其中有一个是重复的,现在我们生产出1到N-1个不同重量,无重复的金条,然后将两组金条的重量加和,相减求出重量的差值,在用第1到N-1中最大的数(N-1)减去差值,就求出了需要找到重复数字。
例如:{1,2,3,3,4}这五个数,可以看做是{1,2,3,4}这四个数中插入了3这个数字,按照上述描述,我们产生{1,2,3,4,5}这五个数,可以看做是{1,2,3,4}中插入了5这个数字,将两组数加和,求出差值2,在用5减去2求得重复数字3。改进后的程序如下所示:
/************************************************************************/
/* 功能:数组a[N],存放了1至N-1个数其中某个数重复一次,找出被重复的数字.时间复杂度必须为o(N)
/* 作者:ZL
/* 日期:2018-04-08 14:38
/************************************************************************/ #include <stdio.h> int do_dup(int a[],int n); int main(void)
{
int a[]={,,,,};
int data=;
int n=;
int i;
data=do_dup(a,n);
printf("data=%d\n",data);
for (i=;i<;i++)
{
printf("%d\n",a[i]);
} } int do_dup(int a[],int n)
{
int sum1=,sum2=;
int j;
for (j=;j<n;j++)
{
sum1+=(j+);
sum2+=a[j];
}
return n-(sum1-sum2); }
程序在VC++6.0运行的结果如下图所示:

改进后的程序,没有破坏原来的数组值,比上一个程序好。
C语言学习(二)的更多相关文章
- Dart语言学习(二) Dart的常量和变量
1.使用var声明变量,可赋予不同类型的值 Dart是一个强大的脚本类语言,可以不预先定义变量类型 ,自动会类型推导 Dart中定义变量可以通过var关键字可以通过类型来申明变量 var str='t ...
- Go语言学习笔记十二: 范围(Range)
Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...
- Go语言学习笔记二: 变量
Go语言学习笔记二: 变量 今天又学了一招如何查看go的版本的命令:go version.另外上一个笔记中的代码还可以使用go run hello.go来运行,只是这种方式不会生成exe文件. 定义变 ...
- GO语言学习(二)Windows 平台下 LiteIDE 的安装和使用
1. 安装 Go 语言并设置环境变量 参考GO语言学习(一) 2. MinGW 的下载和安装 Windows 下的 Go 调试还需要安装 MinGW. 2.1 下载安装工具的安装 最新版本下载安装工具 ...
- C语言学习 第九次作业总结
本次作业练习的内容是二维数组.下面我先简单的说下二维数组的基本知识点: 二维数组其实这个中文概念颇有误导--会让人感觉这是一个两个维度的概念.所以很多的国外的C语言书籍上会称这种数组为多下标数组:即首 ...
- C语言学习 第七次作业总结
C语言学习 第七次作业总结 数组可以分为数组和多下标数组(在传统的国内C语言书本中,将其称为二/多维数组). 数组名称 在之前的课程中,大家应该都有印象,对于int a这样的定义,会为变量 a 声明一 ...
- HTML语言学习笔记(会更新)
# HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...
- 20155229-付钰涵-分析自我技能延展到c语言学习状况
我的小技能 我记得幼儿园时表演的舞蹈,也记得从水彩到素描的学习,还记得小学和初中获得的钢琴省级奖项. 舞蹈止于一年级,绘画止于三年级,钢琴从学前班到高一那十年的时间里有过断续. 03年-04年的那个冬 ...
- linux 下C语言学习路线
UNIX/Linux下C语言的学习路线.一.工具篇“公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工 ...
- 足球运动训练心得及经验分析-c语言学习调查
在准备预备作业02之前,我参考娄老师的提示,阅读了<[做中学(Learning By Doing)]之乒乓球刻意训练一年总结>一文. 在文章描述的字里行间,给予我的印象是系统.负责,娄老师 ...
随机推荐
- NancyFX 第六章 视图引擎
正如其他的Web工具包,Nancy也有视图的概念,用来描述在浏览器上看到的输出 视图的定义 你可能没有之前没有接触过"视图"的概念,或是仅仅是从其他工具包例如ASP.NET MVC ...
- javaweb 关于页面获取数据
EL(Excepress Language表达式语言) 1.....所有的EL都是以$"{"开始,以"}"结尾的.例:${sessionScope.user.s ...
- 【Demo Project】AjaxSubmit+Servlet表单文件上传和下载
一.背景 前段时间公司要求我做一个上传和下载固件的页面,以备硬件产品在线升级,现在我把这部分功能抽取出来作为一个Demo Project给大家分享. 话不多说,先看项目演示 --> 演示 源码 ...
- Win32 API之绘图函数
AbortPath 抛弃选入指定设备场景中的所有路径.也取消目前正在进行的任何路径的创建工作 AngleArc 用一个连接弧画一条线 Arc 画一个圆弧 BeginPath 启动一个路径分支 Canc ...
- C语言第十一次作业--函数嵌套调用
一.实验作业 1.1 PTA题目:递归法对任意10个数据按降序排序 设计思路 定义整型循环变量i,最小值下标min,中间变量t 若n==1,直接返回 否则 min=10-n 最小值下标赋初值 for ...
- JSON基础(JavaScript)
1.在JS中使用JSON,先将字符转换为JOSN格式然后就可以直接使用: var obj = JSON.parse(cInfoObj) $('#staffName').val(obj.candidat ...
- json字符串对象内嵌json对象
有时候需要在json的key:value字符串对象中再嵌入一个json对象,如果需要把如下的json对象作为字符串嵌入到json字符串对象中: { "type": 2, " ...
- Oracle中死锁与等待
在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(即S锁).当数据对象被加上排它锁时,其他的事务不能不 能对它读取和修改.加了共享锁的数据对象可以被其他事务读取 ...
- Oracle的用户,权限以及角色
一.用户 1.创建用户 创建用户u密码为aa. SQL> create user u identified by aa; 2.为用户赋予权限 这个用户还不能连接数据库,必须为其赋予一些权限才可以 ...
- .Net开发之旅(一个年少轻狂的程序员的感慨)
高端大气上档次.这次当时一个身为懵懂初中生的我对程序员这一职位的描述.那时虽不是随处都能看到黑客大军的波及,但至少是知道所谓的黑客爸爸的厉害,一言不合说被黑就被黑.对于懵懂的我那是一种向往.自己也曾想 ...