当前课程知识点:C语言程序设计(上) > 数组(二) > 5.9 数组综合应用 > 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留了一个
没有问题
那实际上大家刚才看到
我们前边分析的流程图
而这个程序是
不是按流程图写的
那大家可不可以做这样的事情
把这个程序的流程图画出来
然后呢
把那个流程图的程序
写出来
这本身对我们
就是一种训练
大家可以试着做一下
-1.1 计算机的问题求解方法
--讨论题:数学模型
-1.1 计算机的问题求解方法--作业
-1.2 C语言与C程序
--讨论题:运算符
-1.3 C语言处理系统与程序调试运行
--例程
-1.4 程序中的人机交互
--例程
--作业讨论区
-2.1 算术运算的C程序实现
--算术混合运算.c
-2.1 算术运算的C程序实现--作业
-2.2 关系运算的C程序实现
--bukao.c
--字符比较.c
--讨论题:比较大小
-2.2 关系运算的C程序实现--作业
-第二周作业--作业
-2.3 逻辑运算的C程序实现
--计算结合性
--闰年.c
--自动购票问题.c
-2.3 逻辑运算的C程序实现--作业
-2.4 位运算的C程序实现
--讨论题:位运算
-2.5 几种很个别的运算
--讨论题
--讨论题
-2.5 几种很个别的运算--作业
-2.6 混合运算及数据类型转换
--讨论题:数据类型
-2.7 顺序结构程序实例
--Video
--三角形面积.c
--讨论题:工业产值
-2.7 顺序结构程序实例--作业
-3.1 程序中的路径选择实现
--打印学生成绩.c
--一元二次方程.c
-3.1 程序中的路径选择实现--作业
-3.2 路径中的再选择——嵌套判断
--例程
--讨论题:程序改错
-3.2 路径中的再选择——嵌套判断--作业
-3.3 复杂判断问题的C程序设计
--3.3 多级选择
--银行存款.c
--讨论题:多级选择
-3.4 多分支问题的C程序设计
--加减乘除运算.c
-3.4 多分支问题的C程序设计--作业
-3.5 GOTO的适当使用
-3.6 选择结构的程序实例
--3.6 程序展示
--计算第几天.c
--讨论题:输出奇数
--讨论题:计算税金
-3.6 选择结构的程序实例--作业
-第四周作业--作业
-4.1 需要重复执行的程序
--求和.c
--打印学生成绩.c
--统计录入速度.c
--求平均数.c
-4.1 需要重复执行的程序--作业
-4.2 至少要执行一次的循环
--n的阶乘.c
--字符分类统计.c
-4.2 至少要执行一次的循环--作业
-4.3 已知循环次数用for语句
--求和问题.c
--数列求和.c
--讨论题:循环语句
-4.3 已知循环次数用for语句--作业
-4.4 循环控制——简单循环应用
--水仙花数.c
--讨论题:死循环
--讨论题:猜数字
-循环结构的程序设计(一)--4.4 循环控制——简单循环应用
-4.5 循环的嵌套
--讨论题:程序运行
-4.5 循环的嵌套--作业
-4.6 break与continue
--最大素数.c
-4.6 break与continue--作业
-4.7 循环的综合应用
--数的排列组合.c
--鸡兔同笼.c
--打印空心字符.c
--讨论题:打印图形
--讨论题:计算闰年
-第六周作业
-第六周作业--作业
-5.1 同类有序数据处理问题
-5.2 一维数组的定义和引用
--数组定义.c
--数组初始化.c
--反向输出.c
--讨论题:对称数
-5.2 一维数组的定义和引用--作业
-5.3 一维字符串数组
--讨论题:编程
-5.4 字符串处理函数
--字符串反向.c
--字符串函数
-5.5 二维数组的定义与使用
-5.6 二维数组的输入输出
-5.6 二维数组的输入输出--作业
-5.7 二维数组的应用
--转置矩阵.c
--讨论题:修改程序
-5.8 二维字符数组
--5.8 单词排序
--单词排序.c
-5.8 二维字符数组--作业
-5.9 数组综合应用
--统计成绩.c
--统计字符次数.c
--讨论题:洗牌
-本期课程结束语
--end
-第八周编程作业
-《C语言程序设计(上)》期末复习参考
--html
-《C语言程序设计(上)》期末复习参考答案
--html