【OJ】字符串去重并并按原顺序打印出重复字符
ACM上一道简单的字符串题,从网上找了下类似的代码进行参考外加之个人思考,想到此好思路。
题目大意
任意输入一行字符串,检索重复出现的字符。将原字符串中的重复字符删除后按照原顺序输出,同时按照原顺序输出有哪些字符是重复的。
输入
输出
两个输出之间空一行
样例输入
ads_fagaerididfhdus_afiew
样例输出
ads_fgerihuw ads_fei
看到此题,第一想法就是用个初始值全为 0 的flag[100000]数组来进行标记,首先是遍历整个字符串,从第i个字符开始与整个字符串所有字符(就不单独把第 i 个字符除开,后面计算时可能有点麻烦,进行判断时 flag[i] == 1 就行了)进行一一比较,如有重复则flag[i] ++ ,最后通过 flag[i] 的值来判断。如果 falg[i] == 1 则打印到屏幕上,但是这样只是把没有重复的字符打印出来,并没有将重复的字符删除而且重复的字符都没有打印到屏幕上,这样明显是不符合题目要求。
那要怎样呢?是遍历字符串时把第 i 个字符与字符前或字符后的字符进行对比么,如果这样可以根据各个重复字符的 flag[i] 进行判断,到时只需把 flag[i] == 0 和 flag[i] == 2 打印到屏幕上就可以了。这个对题目中的第一要求删除重复字符按顺序打印到屏幕还过得去,不过第二个按照顺序提取重复的字符又怎么做?因为重复字符出现可不一定是两次,这样 flag[i] 可能为 1、2、3、、4、、、 这样就不要判断了。
通过参考网上的代码,那么这个思路就出来了。众所周知,我们键盘输入的字符在ASCII字符集都有对应的ASCII码,把字符的ASCII码一一对应,可以看成一个容量为 128 的数组,字符ASCII的编码就在 0-127 之间嘛。此思路也解决前面那种每个位置上的字符都要一个 flag 空间了,只需要 128 容量的空间就足矣。
在这条思路下,我们就初始化所有 flag[128] = {} 在遍历字符串时先判断 flag[str[i]] 是否为 0 因为初始都是 0 所以每个字符对应的 ASCII 码的 flag 都是为 0 的,而在每个进行了判断且满足条件的 flag[str[i]] 都改变其值为 1 (不为0即可),这样当下一个相同字符进行判断时就不满足条件被拒之门外,而所有满足条件的都打印到屏幕上了。这样子题目的第一要求就满足了,
那么第二要求呢?还是这个套路,有点像是递归的味道。就之前的判断进行下去,如果进行 str[i] 被拒之门外了怎么办呢?我们还要打印它一次呢,还有它们了中也是有重复的呀。OK , 旧套路嘛 将上边不满足条件的 flag[str[i]] = 2 (不为 1 就行 为了区分就赋值为 3 吧)。
好,这样之后,所有重复的字符ASCII码对应的 flag[str[i]] 的值都为 2 了,就像第一要求那样所有字符对ASCII对应的 flag[str[i]] 都为 0,同样就可以套用第一要求的代码模型啦。再来一个for循环,以 flag[str[i]] == 2 作为判断条件,如果满足条件则将其改变为 3 (不为 2 就行)。这时不满足条件的就不管了,因为已达到要求 那些就没用了,我们将满足条件的打印到屏幕上就行了。
最后,代码如下:
#include<stdio.h>
#include<string.h>
int main(void)
{
int i;
char a[];
int flag[] = {};
gets(a);
for(i = ; i < strlen(a); i ++) if(flag[(int)a[i]] == ) {
flag[(int)a[i]] = ;
printf("%c", a[i]);
}//删除重复字符后按照原顺序打印
else
flag[(int)a[i]] = ;
printf("\n\n");//空一行
for(i = ; i < strlen(a); i ++)
if(flag[(int)a[i]] == )
{
flag[(int)a[i]] = ;
printf("%c", a[i]);
}//按照原顺序打印重复字符
}
【OJ】字符串去重并并按原顺序打印出重复字符的更多相关文章
- java算法面试题:有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数 按值的降序排序,如果值相同则按键值的字母顺序
package com.swift; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; publi ...
- C语言:根据形参c中指定的英文字母,按顺序打印出若干后继相邻字母,-主函数中放入一个带头节点的链表结构中,h指向链表的头节点。fun函数找出学生的最高分-使用插入排序法对字符串中的字符进行升序排序。-从文件中找到指定学号的学生数据,读入次学生数据,
//根据形参c中指定的英文字母,按顺序打印出若干后继相邻字母,输出字母的大小与形参c一致,数量由形参d指定.例如:输入c为Y,d为4,则输出ZABC. #include <stdio.h> ...
- java算法面试题:从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序 ;读取docx 读取doc 使用poi 相关jar包提集提供下载
从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序 1,张三,28 2,李四,35 3,张三,28 4,王五,35 5,张三,28 6,李四,35 7,赵六,28 ...
- 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输 ...
- 剑指offer27:按字典序打印出该字符串中字符的所有排列
1 题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: ...
- C语言:将s所指字符串中下标为偶数同时ASCII值为奇数的字符删去,-将a所指字符串中的字符和b所指字符串中的字符的顺序交叉,-将形参s所指字符串中的所有数字字符顺序前移,
//函数fun功能:将s所指字符串中下标为偶数同时ASCII值为奇数的字符删去,s所指串中剩余的字符形成的新串放在t所指的数组中. #include <stdio.h> #include ...
- [google面试CTCI]1-3.字符串去重
[字符串与数组] Q:Design an algorithm and write code to remove the duplicate characters in a string without ...
- 在C++中打印出变量的方法
在C++中只能显示出字符串,而如果要想打印出其他类型的变量,则只能将其先转换为字符串类型. 例如:想打印出int型变量value的值 int value; 则需: char str[1];//定义一 ...
- 打印出不同顺序的字符串&单引号和双引号的差异
发现一个很好玩的打印顺序 package com.liaojianya.chapter1; /** * This program demonstrates the string. * @author ...
随机推荐
- STM32 一个定时器产生4路 独立调频率,占中比可调,脉冲个数可以统计。
实现这个功能,基本原理是利用STM32 的输出比较功能. 1.其它设置就是普通定时器的设置这里开启,四个输出比较中断,和一个更新中断, 更新中断这里不需要开也可以达到目的,我这里开启是做其它的用处的. ...
- Linux基础命令---文本格式转换fmt
fmt 将指定文件的内容,按照指定的格式重新排版,结果送到标准输出. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. 1.语法 ...
- golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息
golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...
- bzoj3678 简单题
题目链接 bitset #include<algorithm> #include<iostream> #include<cstdlib> #include<c ...
- 4、CentOS6.5下安装php5.3
操作系统:CentOS6.5 环境:Apache2.2安装成功.可查看:http://www.centoscn.com/image-text/install/2014/0505/2910.html M ...
- 介绍python中运算符优先级
下面这个表给出Python的运算符优先级,从最低的优先级(最松散地结合)到最高的优先级(最紧密地结合).这意味着在一个表达式中,Python会首先计算表中较下面的运算符,然后在计算列在表上部的运算符. ...
- git clone 报错Unable to negotiate with xxx.xxx.xxx.xxx port 12345: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1
在执行git clone命令报错 Unable to negotiate with xxx.xxx.xxx.xxx port 12345: no matching key exchange metho ...
- VMware环境安装MacOS
环境: win10专业版 VMware 14 Pro 开始吧 1. 停止服务 2. 解压并管理员权限运行unlocker,目的是使得 win10 环境下的 VMWare14Pro 支持 mac 系统的 ...
- JS方法转字符串
今天接手的代码比较特殊,需要动态拼接一个table,每一行<tr>都是通过转换为字符串,再拼接在一起放到tbody中的. 其中有的td标签中有a标签,需要给a标签添加点击事件,参数好多,动 ...
- Examples of Scikit-learn Usages
Examples of Scikit-learn Usages KFold K-折交叉验证 >>> import numpy as np >>> from skle ...