CareerCup之1.3字符串去重
【题目】
原文:
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字符串去重的更多相关文章
- 2015.4.25-2015.5.1 字符串去重,比例圆设计,中奖机和canvas橡皮擦效果等
1.字符串去重,html模板取值 2.javascript正则表达式之$1...$9 3.jquery插件 4.返回上一页并刷新 解决方法: <a href ="javas ...
- JS实现字符串去重,数组去重
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- c++ 字符串去重
##### c++ 字符串去重 == 需求 == * 编写一个字符串过滤函数,若字符串出现多个相同的字符,将不是首次出现的字符过滤掉. > 输入:"apache" 输出:&q ...
- js字符串去重
js字符串去重: 1. 去掉字符串前后所有空格: function Trim(str) { return str.replace(/(^\s*)|(\s*$)/g, ""); } ...
- js 数组&字符串 去重
Array.prototype.unique1 = function() { var n = []; //一个新的临时数组 for(var i = 0; i < this.length; i++ ...
- 面试题常考&必考之--js中的数组去重和字符串去重
1.引入:首先得知道数组没有可以直接去重的方法,即直接[].unique()是不支持的, 会报“Uncaught TypeError: [].unique is not a function”错误, ...
- c++实现哈夫曼树,哈夫曼编码,哈夫曼解码(字符串去重,并统计频率)
#include <iostream> #include <iomanip> #include <string> #include <cstdlib> ...
- C#中有关字符串去重的解决方案
今天在群里看到一个同学的面试题 题目中有一个这样的要求 //本地有个文档文件a.txt里面包含的内容分为一段字符串"abacbacde"请编写一个程序,获取文件得到对应的内容,并对 ...
- C语言对字符串去重
# include <stdio.h> # include <string.h> char * getNewChar(char * str,char * newStr); in ...
随机推荐
- 数据库-mysql数据类型
MySQL 数据类型 MySQL中定义数据字段的类型对你数据库的优化是非常重要的. MySQL支持多种类型,大致可以分为三类:数值.日期/时间和字符串(字符)类型. 数值类型 MySQL支持所有标准S ...
- python基础-类的反射
1)反射是通过字符串方式映射内存中的对象. python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr, 改四个函数分别用于对对象内部执行:检查是 ...
- day10作业
1.Java中,用{}括起来的代码称为代码块. 代码块分为局部代码块,构造代码块,静态代码块,同步代码块 局部代码块:在方法中出现,限定生命周期,及早释放,提高内存利用率 构造代码块:在类中方法外出现 ...
- information_schema Introduction
information_schema介绍 information_schema数据库是MySQL自带的,里面的“表”保存着服务器当前的实时信息.它提供了访问数据库元数据的方式.元数据是关于数据的数据, ...
- 有关c语言编程
有关C语言编程 统计代码"行数" 对于统计代码"行数",行数不包括空白行和注释行.程序改进如下: while(fgets (mystring , 100 , f ...
- contabs.js 的使用
1. 先下载两个文件 https://files.cnblogs.com/files/xiaojf/style.css https://files.cnblogs.com/files/xiaojf/c ...
- HBase(七)Hbase过滤器
一.过滤器(Filter) 基础API中的查询操作在面对大量数据的时候是非常苍白的,这里Hbase提供了高级的查询方法:Filter.Filter可以根据簇.列.版本等更多的条件来对数据进行过滤,基于 ...
- Two Seals codeforces 837c
Two Seals 一个矩形a*b,若干子矩形,子矩形中选2个,不重叠能覆盖最大 思路: 枚举: 代码: #include <cstdio> #include <cstring> ...
- 【51nod】1773 A国的贸易
题解 FWT板子题 可以发现 \(dp[i][u] = \sum_{i = 0}^{N - 1} dp[i - 1][u xor (2^i)] + dp[i - 1][u]\) 然后如果把异或提出来可 ...
- Linq To Sql 使用初探
最近有数据处理需要,就是那种从数据库中把数据取出来 ,对其中的部分字段做一些处理再吐回去的工作,从同事那里学习到了,这中活最适合使用 Linq to Sql 这种方式,不用搭建框架,不用自建实体,直接 ...