当前课程知识点:C语言程序设计(上) >  数组(二) >  5.9 数组综合应用 >  5.9.2 应用2——删除重复字符

返回《C语言程序设计(上)》慕课在线视频课程列表

5.9.2 应用2——删除重复字符在线视频

5.9.2 应用2——删除重复字符

下一节:删除串中的重复字符串

返回《C语言程序设计(上)》慕课在线视频列表

5.9.2 应用2——删除重复字符课程教案、知识点、字幕

大家好

我们再来看一道例题

这其实是一个一维数组的应用

怎么做呢

删除什么呢

比如说

这样的一个串

谁重复呢

我们看

1

这有个1

3个1

只留一个

那当然留的是第一个

比如说m

有两个m

留一个

重复的字符删掉

怎么删呢我们说

这个字符串

我们坑定会把它

放在一个一维数组里

那数组是

一个坑里放了一个字符

我怎么把它删掉呢

所以基本思路是这样

你看

我们是不是这样

把这个

原始的串

放在一个数组里

我们再申请一个新的串

把不相同的字符拿进来

最后我们把生成的新串输出

就可以了

这是最简单的一个思路

也就是说

我们把原始的串叫老串

放在一个数组里

再申请一个

新的字符串

然后呢

怎么做呢

比如说我找到了这个1

这个1要不要放在新串里呢

它在于要和

它前边已经放进来的数

第一个去比较

比第一个回合就发现

相等

一样

那我就不拿过来了

蓝颜色我表示

不拿过来

这个位置上

这个1不过来了

同样

那如果我们找到m

m也需要做这个工作

也总是和第一个比

一样吗

不一样

那还要比

和第二个一样吗

一样吗

一直在比

一直比到它自己的时候发现

没有跟它相同的

当然m就过来

那这样做完了

每一个

字符

要不要过来呢

我们把它都比较了

和它前边的字符

都遍历了一遍

那么把所有字符过来

当然是外循环

而这个字符呢

要不要过来呢

是跟内循环去比较

我么这都用了

两个一维数组

来做这件事情

这就是

基本的一个过程

那么最终呢

这个字符串里边应该过来的是

这些字符

那我们根据刚才

分析的这个基本思路

我们是不是可以画一个流程

是这样

输入这个字符串

生成我们刚才说的原始串

老串

你输入了这个原始的串

敲了几个呢

你用一个一个数吗

不用啊

我们用这个函数

求一下它的串长

然后呢

我们再把第一个字符

不用判断

把第一个字符

就放到你那个数组里

拿出来第一个字符

去进行

判断

说你做完了吗

我每拿一个

每从这个老串里拿一个字符

要做这个

比较的时候

我都会问你是那个结束标记吗

要不是结束标记

我再做

否则

我们就不做了

所以呢

再这说

判断

你当前的这个循环变量

比串长是小吗

小于串长我们就做这一些事情

那这边的事情

显然是比较说

你和前边的字符有重复吗

这是在这做

只要

你还没找完

你就一直来做这件事

而这件事情里

每一次是做的是什么呢

j从

到哪里

到你要找的当前的位置上时

i位置

找第i个数要不要复制的时候

我们是和

从第一个

j从0开始到

i

和它比较

当然它自身

就不用比较了

它自身的前一个

所以是小于i

去做什么呢

判断

它俩相等吗

如果相等

无条件的

break

走掉

如果相等

无条件的break走掉

然后呢

就回去了

取下一个字符

到这取下一个字符

如果不相等呢

回来

再走

那和下一个相等吗

和下一个

下一个

一直到

当前数的前一个

位置

这就是

我们所说的内循环

而外循环里边呢

是说

每一个数

都要拿来

做这样一系列的比较

那我们把这个程序

写下来的话

我们看一下

我们来看一下这个程序

大家看一下我们这里边

定义了两个数组

两个数组都是100

字符型的数组

然后呢

给谁获得了数据

str1

说明它是我们

有串的这个数组

下边做什么呢

看我们有没有数数

没数数

直接给n赋了一个0

我们再往下看

这是不是刚才那个流程图所对应的

那个算法呢

我们看一下

for从

i从0开始到谁结束

以斜杠0结束

那么也就是说

我们

老的这个有字符的串里边

每拿出来一个字符的时候

都问它是结束标记吗

所以干脆我们就没有数

刚才敲进来的那个串到底多长呢

而是直接就拿它的结束标记做

循环的终止

这是没有问题的

那现在下边呢

我们做什么呢

看j从0开始

到谁呢

到小于n

而n赋的是

初值是0

那j小于n

j的初值是0

n也是0

那现在

小于n吗

不小于n

不满足这个条件

那第一个回合

这件事情就没做

没做到了哪了

到了这了

这是说

j和n相等吗

此刻的j和n是相等的

因为循环没有做

这个循环没有做

j就没有加加

然后呢

j没有加加的时候

那j和0

是相等的

那我们就相当于

把第一个字符

第一个字符

老串里的第一个字符

送到新串里边

送的新串里边的

下标是谁呢

我们看

这块很有意思

我们用了n加加

做它的下标

用了一个表达式做下标

那我们会担心说

送到

n是1吗

当然不会了

不是加加n

是n加加啊

所以我们第一次肯定是送到

str2的0里边

第一个元素里边

这是对第一个

那么

回过头来我们再看

等到下一次我们要循环的时候

n不是0了

n已经是1了

可是j却还是从0开始

你从0循环到1

那因为

这样比较省事在哪呢

我对i访问的时候

我就拿

我进来了

新串里边进来了几个数

这是对新串的计数

对新串的计数

我正好用这个计数器的内容

就作为

我内循环的终值

这也是比较好的

一种考虑

但是这个程序的

可读性

就会要仔细看

大家要仔细看它的思路

思路是说

我用

新串里边的计数器

进来了几个字符

我计了一下数

那么

这就是我下一次

取下一个数的时候

要比较的

要循环的次数

这个就是比较巧妙的用了

带下标的变量

既作了计数器

又作了循环的控制的那个

终值

又作了我们实用的下标

这个结束以后

我们这一块就得到了

一个新的串

然后

puts

这个str2

我们运行一下这个程序看一下

我们给一个

随便给一个

大家看一下

刚才这里边有没有重复呢

这几个j肯定是有重复的

我们看输出的是

前边的都没有重复

后边j留了一个

没有问题

那实际上大家刚才看到

我们前边分析的流程图

而这个程序是

不是按流程图写的

那大家可不可以做这样的事情

把这个程序的流程图画出来

然后呢

把那个流程图的程序

写出来

这本身对我们

就是一种训练

大家可以试着做一下

C语言程序设计(上)课程列表:

从问题到C语言程序设计

-1.1 计算机的问题求解方法

--1.1.1--程序设计面向的问题

--1.1.2--关于计算

--1.1.3-1关于算法-算法的特征

--1.1.3-2关于算法——算法的表示

--1.1.3-3关于算法——算法的优化

--1.1.4-1-程序设计方法

--1.1.4-2-程序设计方法

--讨论题:数学模型

-1.1 计算机的问题求解方法--作业

-1.2 C语言与C程序

--1.2.1-1-C概述

--1.2.1-2-C概述

--1.2.2-C初步

--讨论题:运算符

-1.3 C语言处理系统与程序调试运行

--1.3.1C程序如何调试运行

--1.3.2常用C语言处理系统

--1.3.3DEVC++的使用-v1

--1.3.4C语言概貌小程序

--例程

-1.4 程序中的人机交互

--1.4 printf用法

--1.4.2 scanf的用法

--例程

--作业讨论区

数据计算实现与顺序结构程序设计(一)

-2.1 算术运算的C程序实现

--2.1.1 第二章

--2.1.2 C语言算术表达式概念

--2.1.3 算术运算的实现

--2.1.4 整数相除

--2.1.5 输入格式造成的计算错误

--2.1.6 求余运算

--2.1.7 自增自减运算

--2.1.8 复合运算

--fangcheng.c

--fangcheng-1.c

--fangcheng-2.c

--fangcheng-3.c

--fangcheng-4.c

--算术混合运算.c

--讨论题:自增自减符

--讨论题:程序输出结果

--讨论题:程序运行结果

-2.1 算术运算的C程序实现--作业

-2.2 关系运算的C程序实现

--2.2.1 关系比较问题

--2.2.2 C语言关系表达式

--2.2.3关系运算优先级

--2.2.4 用关系运算做判断条件

--2.2.5 程序实例

--2.2.6 字符比较

--bukao.c

--pingshifen-1.c

--panduanzhengshu.c

--pingshifen-2.c

--字符比较.c

--讨论题:比较大小

--讨论题:程序的运行

-2.2 关系运算的C程序实现--作业

-第二周作业--作业

数据计算实现与顺序结构程序设计(二)

-2.3 逻辑运算的C程序实现

--2.3.1 逻辑运算问题~1

--2.3.2 逻辑运算表达式

--2.3.3 如何判断闰年

--2.3.4 逻辑运算优先级

--2.3.5 条件运算符

--计算结合性

--2.3.7 一个简单实例

--闰年.c

--自动购票问题.c

--讨论题:逻辑表达式

-2.3 逻辑运算的C程序实现--作业

-2.4 位运算的C程序实现

--2.4.1 什么是位运算

--2.4.2 位运算有哪些

--2.4.3 位运算怎么用

--讨论题:位运算

-2.5 几种很个别的运算

--2.5 几个很个别的运算

--讨论题

--讨论题

-2.5 几种很个别的运算--作业

-2.6 混合运算及数据类型转换

--2.6 混合运算及数据类型转换

--讨论题:数据类型

-2.7 顺序结构程序实例

--2.7.1 第一个程序:三角形

--Video

--三角形面积.c

--讨论题:工业产值

--讨论题:程序无效结果

-2.7 顺序结构程序实例--作业

选择结构的程序设计

-3.1 程序中的路径选择实现

--3.1.1_1 第三章

--3.1.1_2 神奇的if_else

--打印学生成绩.c

--一元二次方程.c

-3.1 程序中的路径选择实现--作业

-3.2 路径中的再选择——嵌套判断

--3.2.1_1 if语句的嵌套

--3.2.1_2三个数排序1029

--例程

--3.2.2 用户登录检查

--三个数排序_未优化.c

--三个数排序_优化.c

--讨论题:程序改错

-3.2 路径中的再选择——嵌套判断--作业

-3.3 复杂判断问题的C程序设计

--3.3 多级选择

--银行存款.c

--讨论题:多级选择

-3.4 多分支问题的C程序设计

--3.4.1 switch语句表达式

--3.4.2 加减乘除计算

--3.4.3 几类说明

--加减乘除运算.c

--讨论题:关于switch

-3.4 多分支问题的C程序设计--作业

-3.5 GOTO的适当使用

--3.5 GOTO的适当使用

-3.6 选择结构的程序实例

--3.6 程序展示

--计算第几天.c

--存款利息__switch实现.c

--讨论题:输出奇数

--讨论题:计算税金

-3.6 选择结构的程序实例--作业

-第四周作业--作业

循环结构的程序设计(一)

-4.1 需要重复执行的程序

--4.1.1----第四章~1

--4.1.2---while实现先判断后循环~1

--4.1.3----while循环的应用-录入速度~1

--求和.c

--打印学生成绩.c

--统计录入速度.c

--求平均数.c

-4.1 需要重复执行的程序--作业

-4.2 至少要执行一次的循环

--4.2.1至少要执行一次的循环

--4.2.2-do-while循环应用

--成绩录入_do while实现.c

--n的阶乘.c

--字符分类统计.c

--讨论题:关于while

-4.2 至少要执行一次的循环--作业

-4.3 已知循环次数用for语句

--4.3.1--用for语句控制循环次数

--4.3.2--循环的应用-求和

--求和问题.c

--斐波那契数列问题.c

--数列求和.c

--讨论题:循环语句的不同

--讨论题:循环语句

-4.3 已知循环次数用for语句--作业

-4.4 循环控制——简单循环应用

--4.4.1-循环的应用-找数-水仙花数

--4.4.2--循环的应用-求素数

--水仙花数.c

--讨论题:死循环

--讨论题:continue和break

--讨论题:猜数字

-循环结构的程序设计(一)--4.4 循环控制——简单循环应用

循环结构的程序设计(二)

-4.5 循环的嵌套

--4.5.1 循环的嵌套——九九乘法表

--4.5.2 循环的嵌套——打印三角形

--打印九九乘法表.c

--打印实心三角图案.c

--打印空心三角图案.c

--讨论题:程序运行

-4.5 循环的嵌套--作业

-4.6 break与continue

--4.6 循环中断与继续循环——break再讨论

--最大素数.c

--求正数个数及平均数.c

-4.6 break与continue--作业

-4.7 循环的综合应用

--4.7.1 数的排列组合问题

--4.7.2 循环综合应用——穷举算法

--4.7.3 循环综合应用——满足条件的数

--4.7.4 循环综合应用——求最后三位数

--4.7.5 循环综合应用——打印空心图案

--数的排列组合.c

--数的排列组合优化.c

--鸡兔同笼.c

--找满足条件的数.c

--输出14的13次方的最后三位数.c

--打印空心字符.c

--讨论题:打印图形

--讨论题:打印空心图形

--讨论题:计算闰年

-第六周作业

--虚拟实验:循环程序设计实验

-第六周作业--作业

数组(一)

-5.1 同类有序数据处理问题

--5.1.0 数组开篇

--5.1.1 同类有序数据存储问题

--讨论题:下标变量与下标

-5.2 一维数组的定义和引用

--5.2.1_1 数组的定义~1

--5.2.1_2 数组的初始化

--5.2.2 一维数组的输入输出

--5.2.3 一维数组的应用1--成绩排序(选择法)~2

--5.2.4 一维数组的应用2--Fibonacci数列

--数组定义.c

--数组初始化.c

--输出大于平均值的数.c

--反向输出.c

--选择法_成绩排序.c

--求斐波那契数列前n项.c

--讨论题:对称数

--讨论题:关于'\0'

-5.2 一维数组的定义和引用--作业

-5.3 一维字符串数组

--5.3 一维字符串数组11.24~1

--用函数测试字符串长度.c

--讨论题:编程

-5.4 字符串处理函数

--5.4 字符数组的输入与输出

--字符串反向.c

--字符串函数

--讨论题:程序如何运行

--讨论题:黑色星期五

数组(二)

-5.5 二维数组的定义与使用

--5.5 二维数组定义

--二维数组的定义与初始化.c

-5.6 二维数组的输入输出

--5.6 二维数组的输入与输出

--二位数组输出_矩阵输出.c

--讨论题:随机数据存储

-5.6 二维数组的输入输出--作业

-5.7 二维数组的应用‍

--5.7.1二维数组的应用-转置矩阵

--5.7.2 用一维数组方式引用二维数组元素

--转置矩阵.c

--找二维数组最大数.c

--讨论题:修改程序

--讨论题:关于随机数函数 rand()

-5.8 二维字符数组

--5.8 单词排序

--单词排序.c

--讨论题:回文字符串

-5.8 二维字符数组--作业

-5.9 数组综合应用

--5.9.1 应用1——学生成绩统计

--统计成绩.c

--5.9.2 应用2——删除重复字符

--删除串中的重复字符串

--5.9.3 应用3——统计字符

--5.9_4数组的应用4--矩阵相乘

--统计字符次数.c

--讨论题:洗牌

-本期课程结束语

--end

-第八周编程作业

--虚拟实验:冒泡排序算法程序设计实验

期末复习

-《C语言程序设计(上)》期末复习参考

--html

期末复习答案

-《C语言程序设计(上)》期末复习参考答案

--html

5.9.2 应用2——删除重复字符笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。