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】字符串去重并并按原顺序打印出重复字符的更多相关文章

  1. java算法面试题:有一个字符串,其中包含中文字符、英文字符和数字字符,请统计和打印出各个字符的个数 按值的降序排序,如果值相同则按键值的字母顺序

    package com.swift; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; publi ...

  2. C语言:根据形参c中指定的英文字母,按顺序打印出若干后继相邻字母,-主函数中放入一个带头节点的链表结构中,h指向链表的头节点。fun函数找出学生的最高分-使用插入排序法对字符串中的字符进行升序排序。-从文件中找到指定学号的学生数据,读入次学生数据,

    //根据形参c中指定的英文字母,按顺序打印出若干后继相邻字母,输出字母的大小与形参c一致,数量由形参d指定.例如:输入c为Y,d为4,则输出ZABC. #include <stdio.h> ...

  3. java算法面试题:从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序 ;读取docx 读取doc 使用poi 相关jar包提集提供下载

    从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序 1,张三,28 2,李四,35 3,张三,28 4,王五,35 5,张三,28 6,李四,35 7,赵六,28 ...

  4. 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

    题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输 ...

  5. 剑指offer27:按字典序打印出该字符串中字符的所有排列

    1 题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: ...

  6. C语言:将s所指字符串中下标为偶数同时ASCII值为奇数的字符删去,-将a所指字符串中的字符和b所指字符串中的字符的顺序交叉,-将形参s所指字符串中的所有数字字符顺序前移,

    //函数fun功能:将s所指字符串中下标为偶数同时ASCII值为奇数的字符删去,s所指串中剩余的字符形成的新串放在t所指的数组中. #include <stdio.h> #include ...

  7. [google面试CTCI]1-3.字符串去重

    [字符串与数组] Q:Design an algorithm and write code to remove the duplicate characters in a string without ...

  8. 在C++中打印出变量的方法

    在C++中只能显示出字符串,而如果要想打印出其他类型的变量,则只能将其先转换为字符串类型. 例如:想打印出int型变量value的值 int  value; 则需: char str[1];//定义一 ...

  9. 打印出不同顺序的字符串&单引号和双引号的差异

    发现一个很好玩的打印顺序 package com.liaojianya.chapter1; /** * This program demonstrates the string. * @author ...

随机推荐

  1. Linux基础命令---添加组groupadd、删除组groupdel

    groupadd 指定群组名称来建立新的群组账号,需要时可以从系统中取得新的群组值. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. ...

  2. POJ 1789 Truck History (Kruskal 最小生成树)

    题目链接:http://poj.org/problem?id=1789 Advanced Cargo Movement, Ltd. uses trucks of different types. So ...

  3. HDU 2175 汉诺塔IX (递推)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2175 1,2,...,n表示n个盘子.数字大盘子就大.n个盘子放在第1根柱子上.大盘不能放在小盘上.  ...

  4. 前端页面报net::ERR_CONNECTION_RESET错误的原因

    本机和测试环境都是OK的.但是一到线上就报错:可能原因总结如下: 1 可能是服务器限制了文件上传的权限. 解决方法:开通了文件上传权限. 2 也许导致这种错误的方式有很多,可能是因为post请求时提交 ...

  5. GoldenGate实时投递数据到大数据平台(2)- Cassandra

    简介 GoldenGate是一款可以实时投递数据到大数据平台的软件,针对apache cassandra,经过简单配置,即可实现从关系型数据将增量数据实时投递到Cassandra,以下介绍配置过程. ...

  6. MySQL底层索引剖析

    1:Mysql索引是什么 mysql索引: 是一种帮助mysql高效的获取数据的数据结构,这些数据结构以某种方式引用数据,这种结构就是索引.可简单理解为排好序的快速查找数据结构.如果要查“mysql” ...

  7. 怎样从外网访问内网Tomcat?

    本地安装了一个Tomcat,只能在局域网内访问,怎样从外网也能访问到本地的Tomcat呢?本文将介绍具体的实现步骤. 准备工作 安装并启动Tomcat 默认安装的Tomcat端口是8080. 实现步骤 ...

  8. e3.7.2-MyEclipse-10.7安装SVN插件

    MyEclipse 10.7的版本是:e3.7.2,要求是匹配该插件eclipse_svn_site-1.10.1的版本,否则无效 将eclipse_svn_site-1.10.1插件文件夹直接拷贝到 ...

  9. OpenGL: 实现立体显示

    https://blog.csdn.net/augusdi/article/details/19922295 立体显示原理:设没有立体显示的模型视图矩阵ModelView为Mv,投影矩阵为Mp,则.物 ...

  10. Prometheus监控学习笔记之Prometheus监控简介

    0x00 Prometheus容器监控解决方案 Prometheus(普罗米修斯)是一个开源系统监控和警报工具,最初是在SoundCloud建立的.它是一个独立的开放源码项目,并且独立于任何公司.不同 ...