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)]之乒乓球刻意训练一年总结>一文. 在文章描述的字里行间,给予我的印象是系统.负责,娄老师 ...
随机推荐
- JDBC存在的问题
1.数据库连接频繁的创建和关闭,缺点是浪费数据库资源,影响操作效率. 设想:使用数据库连接池 2.sql语句是硬编码,如果需求变更需要修改sql,就需要修改java代码,需要重新编译,系统不易维护. ...
- input依次输入密码
原理: 一个真正的可以输入的input框,opacity: 0,设定位层级:(视图不可见的) 再来6(n)个input,readyonly,用来显示,type为password,设置好样式:(视图可见 ...
- Spring源码学习:第2步--使用SLF4j+Log4j日志框架替换掉其自身的commons-logging日志框架
正如Spring官方文档所述,其底层的实现选择了commons-logging作为日志框架.这一"失足"性的选择,竟连Spring自身都抱怨.但是,谁叫Spring如此优秀呢,即使 ...
- gdb命令调试技巧
gdb命令调试技巧 一.信息显示1.显示gdb版本 (gdb) show version2.显示gdb版权 (gdb) show version or show warranty3.启动时不显示提示信 ...
- scanf()中的%c 不能正常输入的问题
#include <stdio.h> int main() { char a; int b; scanf("%d",&b); scanf("%c&qu ...
- 前端的UI设计与交互之设计原则篇
1.亲密性 a)纵向间距示例这三种规格分别为:8px(小号间距).16px(中号间距).24px(大号间距). b)在这三种规格不适用的情况下,可以通过加减『基础间距』的倍数,或者增加元素来拉开信息层 ...
- Swift4--函数,自学笔记
函数 函数名 描述函数功能,调用函数时使用. 定义和调用函数 func greetAgain(person: String) -> String { return "Hello aga ...
- super、this
1)super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句) 2)this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句) 3)super: 它引用当前对 ...
- 移动前端的html5 head 头标签
DOCTYPE DOCTYPE(Document Type),该声明位于文档中最前面的位置,处于 html 标签之前,此标签告知浏览器文档使用哪种 HTML 或者 XHTML 规范. 使用 HTML5 ...
- python爬虫遇到状态码304,705
304状态码是什么? 如果客户端发送了一个带条件的GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个304状态码.简单的表达就是:客户端已经 ...