面试35-删除字符串重复字符-删除出现在第二个字符串中的字符-第一个只出现一次的字符-hash表计数
#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表计数的更多相关文章
- C++版 - 剑指Offer 面试题35:第一个只出现一次的字符 解题报告(华为OJ034-找出字符串中第一个只出现一次的字符)
面试题35:第一个只出现一次的字符 题目:在一个字符串中找到第一个只出现一次的字符.如输入abaccdeff,则输出b.(2006年google的一道笔试题.) 分析: 首先应向确认一下是ASCII字 ...
- 剑指Offer 找出字符串中第一个只出现一次的字符
题目描述 找出字符串中第一个只出现一次的字符 如果无此字符 请输出'.' 输入描述: 输入一串字符,由小写字母组成 输出描述: 输出一个字符 输入例子: asdfasdfo 输出例子: o 思路:数组 ...
- (剑指Offer)面试题35:第一个只出现一次的字符
题目: 在字符串中找出第一个只出现1次的字符,如输入“abaccdeff”,则输出b. 思路: 1.暴力遍历 从头开始扫描字符串中的每个字符,当访问某个字符时,取该字符与后面的每个字符相比较,如果没有 ...
- 剑指offer35题:第一个只出现一次的字符+剑指offer55题:字符流中第一个不重复的字符+剑指offer51题:数组中重复的数字
在看剑指offer的时候,感觉这三个题目很像,都是用哈希表可以解决,所以把这三个题整理出来,以供复习. 剑指offer35题:第一个只出现一次的字符 题目描述:在字符串中找出第一个只出现一次的字符.如 ...
- 【Java】 剑指offer(50-1) 字符串中第一个只出现一次的字符
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在字符串中找出第一个只出现一次的字符.如输入"abacc ...
- 《剑指offer》第五十题(字符串中第一个只出现一次的字符)
// 面试题50(一):字符串中第一个只出现一次的字符 // 题目:在字符串中找出第一个只出现一次的字符.如输入"abaccdeff",则输出 // 'b'. #include & ...
- 【编程题目】在一个字符串中找到第一个只出现一次的字符。如输入 abaccdeff,则输出 b。
第 17 题(字符串):题目:在一个字符串中找到第一个只出现一次的字符.如输入 abaccdeff,则输出 b. 思路:此题非常容易. 最开始是想开辟一块空间存储每个字符出现的次数. 但转念一想,似乎 ...
- 【剑指offer】面试题35:第一个只出现一次的字符
题目: 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符的位置.若为空串,返回-1.(书上是要求返回字符) 思路: 第一遍扫描保存下每个字符出现的 ...
- 剑指Offer 34. 第一个只出现一次的字符 (字符串)
题目描述 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 题目地址 https:// ...
随机推荐
- 【CUDA 基础】3.5 展开循环
title: [CUDA 基础]3.5 展开循环 categories: - CUDA - Freshman tags: - 展开归约 - 归约 - 模板函数 toc: true date: 2018 ...
- su: Authentication failure 的解决方法
su命令不能切换root,提示su: Authentication failure 原因是 没有设置过 root密码 sudo passwd root 会提示输入密码 重新输入密码 下次再su的时候只 ...
- __new()__与__init__()
1. __new__:创建对象时调用,会返回当前对象的一个实例.(默认情况下也就是你在类中没有没有重新这个方法,会默认返回当前类的示例,如果你重写了这个方法,但是在方法中没有返回当前类的示例,那么也就 ...
- LeetCode---Backtracking && DP
**322. Coin Change 思路:动态规划,构造一个数组,存入当前index最少需要多少个coin public int coinChange(int[] coins, int amount ...
- flask入门第一篇
一. Python 现阶段三大主流Web框架 Django Tornado Flask 对比 1.Django 主要特点是大而全,集成了很多组件,例如: Models Admin Form 等等, 不 ...
- Linux :vim 模式下的常用命令
[参考文章]:vim 复制一整行 复制多行 1. 查找命令 ?text 查找text,按n健查找下一个,按N健查找前一个 /text 反向查找text,按n健查找下一个,按N健查找前一个 ...
- 黑马lavarel教程---10、lavarel模型关联
黑马lavarel教程---10.lavarel模型关联 一.总结 一句话总结: 1.模型关联比较方便,一次定义,后面都可以使用 2.关联关系 使用动态属性进行调用 1.一对多,多对多实例? 一对多: ...
- koa 路由模块化(一)
1.项目目录 2.入口文件 根目录/app.js /** * koa 路由模块化 */ const Koa = require('koa'); const router = require('koa- ...
- RF框架自定义测试库开发
静态库 方法(methods)直接映射为关键字名称.关键字接受和方法相同的参数, 通过抛异常来 报告错误, 通过往标准输出里写入来写 log, 同时可以通过return 来返回结果. 创建步骤: ▲ ...
- Android studio 下 NDK Jni 开发 简单例子
1. 创建一个新的工程 2. 创建一个新的类 JniText.java 点击Build--Make Project 后 选中工程 点击F4键 sdk location 中 Android ...