【题目】

原文:

1.3 Design an algorithm and write code to remove the duplicate characters in a string without using any additional buffer. NOTE: One or two additional variables are fine. An

extra copy of the array is not.

FOLLOW UP

Write the test cases for this method.

译文:

设计算法并写出代码移除字符串中反复的字符,不能使用额外的缓存空间。注意: 能够使用额外的一个或两个变量,但不同意额外再开一个数组拷贝。

【分析】

这道题目事实上是要你就地(in place)将字符串中反复字符移除。你能够向面试官问清楚, 不能使用额外的一份数组拷贝是指根本就不同意开一个数组,还是说能够开一个固定大小, 与问题规模(即字符串长度)无关的数组。

依据面试官的回答,制定对应的解题策略。

【思路一】

假设根本就不同意你再开一个数组,仅仅能用额外的一到两个变量。那么,最先想到的方法就是暴力求解法了。

你能够依次訪问这个数组的每一个元素,每訪问一个,就将该元素与前面的元素进行比較,假设同样就去掉,假设不同样就加入到前面序列中。

时间复杂度为O(n^2)

对应代码为代码一

【思路二】

假设根本就不同意你再开一个数组,仅仅能用额外的一到两个变量。另外一种方法就是先排序,再去重。

排序之后反复元素必然是相邻的,这样去重就简单多了。

排序时间复杂度最快为高速排序为O(nlogn)

去重时间复杂度为O(n)

终于为O(nlogn)

对应代码为代码二

【思路三】

1 如果能够开一个固定大小,与问题规模(即字符串长度)无关的数组,那么能够用一个数组来 表征每一个字符的出现(如果是ASCII字符,则数组大小为256),这种话仅仅须要遍历一遍字符 串就可以,时间复杂度O(n)。

对应代码为代码三

2 假设字符集更小一些,比方仅仅是a-z,即字符串里仅仅包括小写字母,那么使用一个int变量中 的每一位来表征每一个字符的出现,用位运算来实现。也能够在O(n)的时间里移除反复字符,并且还不须要额 外开一个数组。

对应代码为代码四

【代码一】

/*********************************
* 日期:2014-5-6
* 作者:SJF0115
* 题目: 字符串中字符去重
* 来源:CareerCup
**********************************/
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std; //删除一个字符串中反复字符
void RemoveDuplicates(char str[]){
int i,j;
if(str == NULL){
return;
}
int len = strlen(str);
//去重
int index = 0;
for(i = 0;i < len;i++){
//str[i]为待考察的元素 与前面元素比較看是否反复
for(j = 0;j < i;j++){
//有反复的元素
if(str[i] == str[j]){
break;
}
}
//str[i] 前面没有与之反复的元素
if(j >= i){
str[index++] = str[i];
}
}
str[index] = '\0';
} int main() {
char str[] = "abababa";
RemoveDuplicates(str);
cout<<str<<endl;
return 0;
}

【代码二】

//删除一个字符串中反复字符
void RemoveDuplicates(char str[]){
if(str == NULL){
return;
}
int len = strlen(str);
//排序
sort(str,str+len);
int index = 1;
//去重
for(int i = 1;i < len;i++){
if(str[i] != str[i-1]){
str[index++] = str[i];
}
}
str[index] = '\0';
}

【代码三】

//删除一个字符串中反复字符
void RemoveDuplicates(char str[]){
bool vis[256];
//初始化
memset(vis,false,sizeof(vis));
int len = strlen(str);
int index = 0;
for(int i = 0;i < len;i++){
if(!vis[str[i]]){
str[index++] = str[i];
vis[str[i]] = true;
}
}
str[index] = '\0';
}

【代码四】

void RemoveDuplicates(char str[]){
int len = strlen(str);
if(len < 2) return;
int check = 0;
int index = 0;
//去重
for(int i=0; i<len; ++i){
int v = (int)(str[i]-'a');
if((check & (1<<v))==0){
str[index++] = str[i];
check |= (1<<v);
}
}
str[index] = '\0';
}

CareerCup之1.3字符串去重的更多相关文章

  1. 2015.4.25-2015.5.1 字符串去重,比例圆设计,中奖机和canvas橡皮擦效果等

    1.字符串去重,html模板取值   2.javascript正则表达式之$1...$9   3.jquery插件   4.返回上一页并刷新 解决方法: <a href ="javas ...

  2. JS实现字符串去重,数组去重

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. c++ 字符串去重

    ##### c++ 字符串去重 == 需求 == * 编写一个字符串过滤函数,若字符串出现多个相同的字符,将不是首次出现的字符过滤掉. > 输入:"apache" 输出:&q ...

  4. js字符串去重

    js字符串去重: 1.  去掉字符串前后所有空格: function Trim(str) { return str.replace(/(^\s*)|(\s*$)/g, ""); } ...

  5. js 数组&字符串 去重

    Array.prototype.unique1 = function() { var n = []; //一个新的临时数组 for(var i = 0; i < this.length; i++ ...

  6. 面试题常考&必考之--js中的数组去重和字符串去重

    1.引入:首先得知道数组没有可以直接去重的方法,即直接[].unique()是不支持的, 会报“Uncaught TypeError: [].unique is not a function”错误, ...

  7. c++实现哈夫曼树,哈夫曼编码,哈夫曼解码(字符串去重,并统计频率)

    #include <iostream> #include <iomanip> #include <string> #include <cstdlib> ...

  8. C#中有关字符串去重的解决方案

    今天在群里看到一个同学的面试题 题目中有一个这样的要求 //本地有个文档文件a.txt里面包含的内容分为一段字符串"abacbacde"请编写一个程序,获取文件得到对应的内容,并对 ...

  9. C语言对字符串去重

    # include <stdio.h> # include <string.h> char * getNewChar(char * str,char * newStr); in ...

随机推荐

  1. HTTP Headers解析

    什么是HTTP Headers? 它包含了哪些内容? 利用requests.get()函数对豆瓣读书进行请求, 返回的r.headers如下所示: >>> import reques ...

  2. Python字符串(Str)详解

    字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可 字符串的格式 b = "hello itcast. ...

  3. 洛谷P2017晕牛

    传送门啦 这个题没有想象中复杂. 我们先有向边建立,因为我们无法改变有向边的方向. 建立完之后跑一边拓扑排序,我们按拓扑序小的指向大的就好了. 解释: 我们知道如果一个点在另一个点顺序的后面的话,如果 ...

  4. HTML5 Differences from HTML4

    Abstract "HTML5 Differences from HTML4" describes the differences of the HTML5 specificati ...

  5. C++之插入迭代器

    #include<iostream> #include<vector> #include<list> #include<iterator> usingn ...

  6. php安装amqp扩展

    1.要安装AMQP PHP扩展,必须先安装librabbitmq库 1.1使用以下步骤下载并安装库: # 下载 git clone git://github.com/alanxz/rabbitmq-c ...

  7. CodeIgniter2.0中sqlserver驱动返回受影响行数问题解决

    最近使用CI写项目时遇到的问题,当使用sqlserve链接操作时 修改和删除返回的受影响行数不对 解决办法如下: 找到ci框架目录中include\database\drivers\sqlsrv\sq ...

  8. 第一个iOS程序:Hello iOS

    今天我们来创建第一个iOS程序:Hello iOS!不需要写任何代码就能实现:

  9. install vscode on centos

    1.down load package from https://code.visualstudio.com/docs/?dv=linux64 2.tar zxf code-stable-code_1 ...

  10. C#导出HTML到PDF组件Pechkin

    http://www.knowsky.com/898441.html C#导出PDF功能是开发中经常遇到的功能,我们采用第三方的组件,比如 iTextSharp, aspose等,还能搜到一些开源的类 ...