1. #include "stdafx.h"
  2. #include <iostream>
  3. using namespace std;
  4. void FirstNoRepeatCh(const char str[], char& ch);
  5.  
  6. int main(int argc, char* argv[])
  7. {
  8. const char* str = "cdceasafggsfrrtkkxx";
  9. char ch = '@';
  10. FirstNoRepeatCh(str,ch);
  11. if(ch == '@')
  12. cout<<"No Find!"<<endl;
  13. else
  14. cout<<ch<<endl;
  15. return 0;
  16. }
  17. //自己编写,即第一种思路
  18. /*void FirstNoRepeatCh(const char str[], char& ch)
  19. {
  20. int HashTable[256] = {0};
  21. while(*str != '\0')
  22. {
  23. if(HashTable[*str] == 0) //用Hash表(哈希表)来判断字符是否重复出现
  24. {
  25. char* pch = (char*)(str+1);
  26. bool chFind = false;
  27.  
  28. while(*pch != '\0' && !chFind)
  29. {
  30. if(*str == *pch)
  31. chFind = true;
  32. pch++;
  33. }
  34. if(chFind)
  35. HashTable[*str] = 1;
  36. else
  37. {
  38. ch = *str;
  39. break;
  40. }
  41. }
  42. str++;
  43. }
  44. }*/
  45. //此为第二种思路+自己编写
  46. void FirstNoRepeatCh(const char str[], char& ch)
  47. {
  48. if(!str)
  49. return;
  50. const int TableSize = 256;
  51. int HashTable[TableSize] = {0};
  52. char* pch = (char*)str;
  53. while(*str != '\0')
  54. {
  55. HashTable[*str]++;
  56. str++;
  57. }
  58. bool chFind = false;
  59. while(*pch != '\0' && !chFind)
  60. {
  61. if(HashTable[*pch] == 1)
  62. {
  63. ch = *pch;
  64. chFind = true;
  65. }
  66. pch++;
  67. }
  68.  
  69. }
  70.  
  71. /*//标准答案
  72. ///////////////////////////////////////////////////////////////////////
  73. // Find the first char which appears only once in a string
  74. // Input: pString - the string
  75. // Output: the first not repeating char if the string has, otherwise 0
  76. ///////////////////////////////////////////////////////////////////////
  77. char FirstNotRepeatingChar(char* pString)
  78. {
  79. // invalid input
  80. if(!pString)
  81. return 0; //因为涉及指针,所以判空
  82.  
  83. // get a hash table, and initialize it
  84. const int tableSize = 256; //最好用const int
  85. unsigned int hashTable[tableSize];
  86. for(unsigned int i = 0; i < tableSize; ++ i)
  87. hashTable[i] = 0;
  88.  
  89. // get the how many times each char appears in the string
  90. char* pHashKey = pString;
  91. while(*(pHashKey) != '\0')
  92. hashTable[*(pHashKey++)] ++;
  93.  
  94. // find the first char which appears only once in a string
  95. pHashKey = pString;
  96. while(*pHashKey != '\0')
  97. {
  98. if(hashTable[*pHashKey] == 1)
  99. return *pHashKey;
  100.  
  101. pHashKey++;
  102. }
  103.  
  104. // if the string is empty
  105. // or every char in the string appears at least twice
  106. return 0;
  107. } */
  108.  
  109. //注意:根据评论可知,若第二次遍历Hash表,则会得到仅出现一次的最小字符

  

剑指offer--13题的更多相关文章

  1. 剑指offer刷题

    1.面试题43. 1-n整数中1出现的次数 输入一个整数 n ,求1-n这n个整数的十进制表示中1出现的次数. 例如,输入12,1-12这些整数中包含1 的数字有1.10.11和12,1一共出现了5次 ...

  2. 剑指 offer 第一题: 二维数组中的查找

    打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣

  3. 剑指Offer编程题2——替换空格

    剑指Offer编程题2——替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happ ...

  4. 剑指Offer编程题1——二维数组中的查找

    剑指Offer编程题1---------------二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完 ...

  5. 剑指 Offer 13. 机器人的运动范围 + 深搜 + 递归

    剑指 Offer 13. 机器人的运动范围 题目链接 package com.walegarrett.offer; /** * @Author WaleGarrett * @Date 2020/12/ ...

  6. 剑指 Offer 13. 机器人的运动范围

    剑指 Offer 13. 机器人的运动范围 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] .一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左.右.上.下移动一 ...

  7. 剑指offer编程题Java实现——面试题13在O(1)时间内删除链表节点

    题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 由于给定的是单向链表,正常删除链表的时间复杂度是查找链表的时间复杂度即O(n),如果要求在O(1)时间复杂度内删除节点 ...

  8. 剑指offer(13)-栈的压入、弹出序列 九度1366

    题目来自剑指offer系列 九度 1366:http://ac.jobdu.com/problem.php?pid=1367 题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列 ...

  9. 牛客网剑指offer刷题总结

    二维数组中的查找: 题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 两 ...

  10. LeetCode剑指Offer刷题总结(一)

    LeetCode过程中值得反思的细节 以下题号均指LeetCode剑指offer题库中的题号 本文章将每周定期更新,当内容达到10题左右时将会开下一节. 二维数组越界问题04 public stati ...

随机推荐

  1. android任意view爆炸效果--第三方开源--ExplosionField

    犹如天女散花一样,爆炸散列,比较有趣.Android ExplosionField在github上的项目主页是:https://github.com/tyrantgit/ExplosionField ...

  2. ContactsContract.CommonDataKinds【Translated By KillerLegend】

    http://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.html interf ...

  3. js中关于prototype学习(2015年1月5号晚)

    prototype在js中为原型,只要是对象都有原型,最高原型为Object. 函数作为一特殊的对象,下面探讨prototype(原型)和function(函数)之间的关系. function A ( ...

  4. DELPHI 使用dbexpress控件连接MySQL数据库方法

    1. 在窗体上放置4个控件: SQLConnection1,SimpleDataSet1,DataSource1,DBGrid (注意: 如果 出现"Operation not allowe ...

  5. Keil的使用方法 - 常用功能(二)

    Ⅰ.概述 上一篇文章是总结关于Keil使用方法-常用功能(一),关于(文件和编译)工具栏每一个按钮的功能描述和快捷键的使用. 我将每一篇Keil使用方法的文章都汇总在一起,回顾前面的总结请点击下面的链 ...

  6. python时间-time模块

    time是python自带的模块,用于处理时间问题,提供了一系列的操作时间的函数. 以下说明针对于 python2.7,其他版本可能有所差异. 模块提供了两个种表示时间的格式: 1.时间戳,是以秒表示 ...

  7. android开发系列之git常用命令

    最近因为跳槽到新公司,然后新公司里面的代码管理工具是gitLab,所以我想在这篇博客里面整理一下git常用的语法. GitLab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托 ...

  8. SQL Server 2008 表变量参数(表值参数)用法

    表值参数是 SQL Server 2008 中的新参数类型.表值参数是使用用户定义的表类型来声明的.使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程 ...

  9. 在C#使用文件监控对象FileSystemWatcher的几种方案

    最近在项目中有这么个需求,就是得去实时获取某个在无规律改变的文本文件中的内容.首先想到的是用程序定期去访问这个文件,因为对实时性要求很高,间隔不能超过1S,而且每次获取到文本内容都要去分发给web服务 ...

  10. iOS学习之C语言内存管理

         一.存储区划分      按照地址从高到低的顺序:栈区,堆区,静态区,常量区,代码区    1.栈区:局部变量的存储区域     局部变量基本都在函数.循环.分支中定义     栈区的内存空 ...