#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
char firstStrAppearOne(const char* str);// 第一个只出现一次的字符
void str1MinusStr2(char* str1,const char* str2);// 删除出现在第二个字符串中的字符
void uniqueStr(char* str);// 删除重复字符
int main()
{
    char* str="aac"; // str指向字符串常量
    cout<<firstStrAppearOne(str)<<endl;
    char str1[]="abcdefghbghc";
    str1MinusStr2(str1,"bce"); // 参数必须是指向可修改内存的指针
    cout<<str1<<endl;
    char str2[]="aaabcdefegghhgi";
   //char str2[]="abcd";
   uniqueStr(str2);
   cout<<str2<<endl;
   return 0;
}
char firstStrAppearOne(const char* str)
{
     if(str==NULL)
         return'\0';
     int hash[256]={0};
     const char* p=str;
     while(*p!='\0')
    {
        ++hash[*p];
        p++;
    }
    while(*str!='\0')
   {
       if(hash[*str]==1)
       return *str;
      ++str;
   }
      return '\0';
}
void str1MinusStr2(char* str1,const char* str2) // 这里的删除字符,是字符前移,后在新的结尾加上\0
{
      if(str1==NULL||str2==NULL)
      return;
      bool hash_flag[256]={0};
      const char* p_str2=str2;
     while(*p_str2!='\0')
    {
         hash_flag[*p_str2]=true;
         ++p_str2;
    }
// 用两个指针实现O(n)的删除移动算法, 关键在于p2的值不能受p1的影响
   char* p1=str1;
   char* p2=str1;

while(*p2!='\0'&&hash_flag[*p2]!=true) // p2的初试值设置为第一个需要删除的结点
    p2++;
   if(*p2=='\0') // 没有需要删除的返回
   return;

char tmp;
   while(*p1!='\0') // p1找到第一个需要删除的点
  {
       while(*p1!='\0'&&hash_flag[*p1]!=true)
       ++p1;
       if(*p1=='\0')
       return;
      else
     {
            while(*p2!='\0'&&hash_flag[*p2]==true) // p2找到后面第一个需要保留的字符
            ++p2;
            if(*p2=='\0')
           {
                 *p1='\0';
                 return;
           }
           else
          {
                 tmp=*p1;
                *p1=*p2;
                *p2=tmp;
           }
     }
     ++p1;
   }
}
void uniqueStr(char* str) // 同上一个算法类似,也是用两个指针
{
        if(str==NULL)
            return;
        bool flag[256]={false}; // 此处如果为true 表示前面出现过,要删除
        char* p1=str;
        char* p2=str;
        while(*p1!='\0') // 为p2设置初始值,指向第一个需要删除的字符
        {
              if(flag[*p1]==false)// 首次出现,相应为置为true
                    flag[*p1]=true;
              else // 第n>2次出现,需要删除
             {
                  p2=p1;
                  break;
              }
             ++p1;
        }
        char tmp;
        while(*p1!='\0') // 此时p1 p2都指向第一个需要删除的字符
        {
              if(flag[*p1]==false)// 首次出现,相应为置为true
                     flag[*p1]=true;
             else // 第n>2次出现,需要删除
             {
                    while(*p2!='\0'&&flag[*p2]==true)
                             ++p2;
                    if(*p2=='\0')
                   {
                        *p1='\0';
                         return;
                   }
                  else
                  {
                        flag[*p2]=true;
                        tmp=*p1;
                       *p1=*p2;
                      *p2=tmp;
                   }
            }
            ++p1;
       }
}

面试35-删除字符串重复字符-删除出现在第二个字符串中的字符-第一个只出现一次的字符-hash表计数的更多相关文章

  1. C++版 - 剑指Offer 面试题35:第一个只出现一次的字符 解题报告(华为OJ034-找出字符串中第一个只出现一次的字符)

    面试题35:第一个只出现一次的字符 题目:在一个字符串中找到第一个只出现一次的字符.如输入abaccdeff,则输出b.(2006年google的一道笔试题.) 分析: 首先应向确认一下是ASCII字 ...

  2. 剑指Offer 找出字符串中第一个只出现一次的字符

    题目描述 找出字符串中第一个只出现一次的字符 如果无此字符 请输出'.' 输入描述: 输入一串字符,由小写字母组成 输出描述: 输出一个字符 输入例子: asdfasdfo 输出例子: o 思路:数组 ...

  3. (剑指Offer)面试题35:第一个只出现一次的字符

    题目: 在字符串中找出第一个只出现1次的字符,如输入“abaccdeff”,则输出b. 思路: 1.暴力遍历 从头开始扫描字符串中的每个字符,当访问某个字符时,取该字符与后面的每个字符相比较,如果没有 ...

  4. 剑指offer35题:第一个只出现一次的字符+剑指offer55题:字符流中第一个不重复的字符+剑指offer51题:数组中重复的数字

    在看剑指offer的时候,感觉这三个题目很像,都是用哈希表可以解决,所以把这三个题整理出来,以供复习. 剑指offer35题:第一个只出现一次的字符 题目描述:在字符串中找出第一个只出现一次的字符.如 ...

  5. 【Java】 剑指offer(50-1) 字符串中第一个只出现一次的字符

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 在字符串中找出第一个只出现一次的字符.如输入"abacc ...

  6. 《剑指offer》第五十题(字符串中第一个只出现一次的字符)

    // 面试题50(一):字符串中第一个只出现一次的字符 // 题目:在字符串中找出第一个只出现一次的字符.如输入"abaccdeff",则输出 // 'b'. #include & ...

  7. 【编程题目】在一个字符串中找到第一个只出现一次的字符。如输入 abaccdeff,则输出 b。

    第 17 题(字符串):题目:在一个字符串中找到第一个只出现一次的字符.如输入 abaccdeff,则输出 b. 思路:此题非常容易. 最开始是想开辟一块空间存储每个字符出现的次数. 但转念一想,似乎 ...

  8. 【剑指offer】面试题35:第一个只出现一次的字符

    题目: 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符的位置.若为空串,返回-1.(书上是要求返回字符) 思路: 第一遍扫描保存下每个字符出现的 ...

  9. 剑指Offer 34. 第一个只出现一次的字符 (字符串)

    题目描述 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 题目地址 https:// ...

随机推荐

  1. 【WebStorm】前端工具开发利器webstrom专篇

    ---------------------------------------------------------------------------------[亲身实测] WebStorm混搭sv ...

  2. [JOI2012春季合宿]Rotate (链表)

    题意 题解 又是一道神仙题-- 显然的做法是大力splay,时间复杂度\(O((N+Q)N\log N)\), 可以卡掉. 正解: 使用十字链表维护矩阵,在周围增加第\(0\)行/列和第\((n+1) ...

  3. Codeforces 474D Flowers(DP)

    题目链接 非常简单的一道dp题,通过O(n)的预处理来使查询变为O(1). 主要的坑在于取模后的dp数组的前缀和再相减可能得到负数,导致无法得到某一区间和的取模. 解决方法:(a-b)%mo==(a% ...

  4. Maven-项目管理(一)_认识Maven

    Maven是什么? Maven是Apache下的项目管理工具,它由纯Java语言开发,可以帮助我们更方便的管理和构建Java项目. 为什么要使用Maven? 1. jar包管理: a) 从Maven中 ...

  5. LeetCode 238. 除自身以外数组的乘积( Product of Array Except Self)

    题目描述 给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积. 示例: 输 ...

  6. LeetCode 81. 搜索旋转排序数组 II(Search in Rotated Sorted Array II)

    题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] ). 编写一个函数来判断给定的目标值是否存在 ...

  7. Omnigraffle

    OmniGraffle 7 Mac 注册码 账号:Appked 密码:MFWG-GHEB-HYTW-CGHT-CSXU-QCNC-SXU https://blog.csdn.net/ChibiMaru ...

  8. EvenBus源码分析

    概述 一般使用EventBus的组件类,类似下面这种方式: public class SampleComponent extends Fragment { @Override public void ...

  9. Carousel 走马灯

    在有限空间内,循环播放同一类型的图片.文字等内容 基础用法 适用广泛的基础用法 结合使用el-carousel和el-carousel-item标签就得到了一个走马灯.幻灯片的内容是任意的,需要放在e ...

  10. BFC是什么?有什么作用?

    BFC(Block Formatting Context)直译为“块级格式化范围”. 一.常见定位方案 在讲 BFC 之前,我们先来了解一下常见的定位方案,定位方案是控制元素的布局,有三种常见方案: ...