问题与解答

问题描述

对给定的一个字符串,找出有重复的字符,并给出其位置。

输入格式

输入包括一个由字母和数字组成的字符串,其长度不超过100。

输出格式

可能有多组测试数据,对于每组数据,

按照样例输出的格式将字符出现的位置标出。

1、下标从0开始。

2、相同的字母在一行表示出其出现过的位置。

样例输入

abcaaAB12ab12

样例输出

a:0,a:3,a:4,a:9

b:1,b:10

1:7,1:11

2:8,2:12

样例说明

给定字符串中重复的字母有a,b,1,2,依次输出上述每个字母在字符串中的全部位置。

//找位置
//hash表+拉链法
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
struct Node{
char element;
int positon;
};
vector<Node> Hash[125];
//hash表,拉链法处理冲突(实现类似图的邻接矩阵)
//hash函数为直接定址:每个字符c对应的ASCII码,大小写字母的ASCII不超过125
//hash表的每个元素是一个变长数组(vector),vector中存储结点Node(包含字符c以及对应的下标位置position)
bool Vis[125] = {false};
//标记数组:Vis[i] = true 表示在哈希表中映射为i的值已经被打印过,无需再打印
void FindPostion(char* s); //找位置并按照题目要求输出
void InsertElement(char c, int position); //将字符串中的字符插入hash表 int main(){
char s[100];
while(scanf("%s", s) != EOF){ //多点输入
FindPostion(s);
}
} void FindPostion(char *s){
int i,j,index,size;
int length = strlen(s);
for(i = 0; i < length; i++) //将字符串s中的每个字符插入hash表
InsertElement(s[i], i); for(i = 0; i < length; i++){
index = s[i] - '0'; //直接定址:得到当前字符s[i]在hash表中的位置
size = Hash[index].size(); //存储当前字符s[i]的变长数组的大小
if(size > 1 && Vis[index] == false){ //size>1说明有s[i]有重复,Vis[]数组防止多次打印结果
Vis[index] = true; //标记,防止多次打印结果
for(j = 0; j < size; j++){ //遍历vector[index],打印结果
if(j == size-1)
printf("%c:%d", Hash[index][j].element, Hash[index][j].positon);
else
printf("%c:%d,", Hash[index][j].element, Hash[index][j].positon);
}
printf("\n");
}
}
} void InsertElement(char c, int position){ //将字符c及其所在的位置存入hash表中
Node n;
n.element = c;
n.positon = position; int index = c -'0'; //直接定址:得到当前字符s[i]在hash表中的位置
Hash[index].push_back(n); //插入
}

题后反思:调试记录

打印顺序错误

  • 改动前:遍历hash表中的每个vector,如果Hash[i].size()>1,则打印结果。
  • 问题:
    • 结果按照字符在hash表中的顺序打印而不是在字符串中的顺序打印;
    • hash[i].size>1判断125次
  • 改动后:
    • 按照原顺序输出
    • hash[i].size>1判断次数等于字符串长度

多次打印

未加入Vis[]数组时,如果字符'a'在字符串中出现n次,那么'a'的相关结果就会打印n次

最新文章

  1. Spring3整合Hibernate4-我们到底能走多远系列(30)
  2. WPF/Silverlight Layout 系统概述——Measure(转)
  3. CoffeeScript学习(3)—— 函数
  4. IOS 如何选择delegate、notification、KVO?(转)
  5. hdu 1021 Fibonacci Again(找规律)
  6. Java HexString
  7. PHPMailer发匿名邮件及Extension missing: openssl的解决
  8. [APUE]进程控制(中)
  9. 《JAVASCRIPT高级程序设计》事件处理程序和事件类型
  10. BZOJ 3680: 吊打XXX【模拟退火算法裸题学习,爬山算法学习】
  11. 聊聊并发(一)深入分析Volatile的实现原理
  12. 不要使用jQuery触发原生事件
  13. QC API全系列揭秘之Test Execution操作(全网首发)
  14. word2vec训练&amp;IC分词(待)
  15. 第三个sprint冲刺第三阶段
  16. jvm运行机制和volatile关键字详解
  17. ElasticSearch 5.4 自定义插件
  18. 枚举enum和enumerate
  19. 超详细的Java面试题总结(二)之Java基础知识篇
  20. Python框架之Tornado(请求阶段)

热门文章

  1. 零基础学习java------day27-28---------电影评分数据案例,. RPC案例
  2. Docker的常用命令总结
  3. 创建线程的第二种方式------实现Runnable接口的方式
  4. java中子类继承父类什么?
  5. 【C/C++】输入:连续输入,以逗号隔开
  6. C语言static关键字
  7. Java 将Word转为OFD
  8. pf4j及pf4j-spring
  9. [BUUCTF]PWN17——[HarekazeCTF2019]baby_rop
  10. 前置任务(Project)