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 ...
随机推荐
- python基础-类的继承
继承:承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”.“父类. 继承的过程,就是从一般到特殊的过程.要实现继承,可以通过“继承”(Inheritance)和“组合”(Compositio ...
- java基础29 迭代器 listIterator() 及各种遍历集合的方法
listIterator() 迭代器包含了 Iterator() 迭代器中的所有方法. 1.ListIterator的常用方法 hasPrevious() :判断是否还有上一个元素,有则返回true ...
- [洛谷P2783]有机化学之神偶尔会做作弊
第一次做出来黑题祭 虽然感觉难度其实并不到黑题的难度 题解: 其实这道题并没用什么特别的知识,只是Tarjan求双联通分量和LCA的结合. 所以,我们可以很显然的发现(如此恶劣的词汇,逃 这道题其实就 ...
- mysql慢sql报警系统
前言:最近有同事反应有的接口响应时间时快时慢,经过排查有的数据层响应时间过长,为了加快定位定位慢sql的准确性,决定简单地搭建一个慢sql报警系统 具体流程如下架构图 第一步:记录日志 每个业务系统都 ...
- JAVA复习笔记:内存结构和类加载
Part1:JVM内存结构 JVM定义了若干个程序执行期间使用的数据区域.这个区域里的一些数据在JVM启动的时候创建,在JVM退出的时候销毁.而其他的数据依赖于每一个线程,在线程创建时创建,在线程退出 ...
- Centos之常见目录作用介绍
我们先切换到系统根目录 / 看看根目录下有哪些目录 [root@localhost ~]# cd / [root@localhost /]# ls bin dev home lib64 mn ...
- 使用T-SQL导入多个文件数据到SQL Server中
在我们的工作中,经常需要连续输入多个文件的数据到SQL Server的表中,有时需要从相同或者不同的目录中,同时将文件中的数据倒入.在这篇文章中,我们将讨论如何同时把一个目录中的文件的数据倒入到SQL ...
- SQL SERVER 触发器介绍
什么是触发器 触发器对表进行插入.更新.删除的时候会自动执行的特殊存储过程.触发器一般用在check约束更加复杂的约束上面.触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作.诸如:upda ...
- JAVA 解析TXT文本
package file; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; im ...
- git clone 某个分支或者所有分支
clone 某个分支: git clone -b dev5 https://git.coding.net/aiyongbao/tradepc.git clone 所有分支: git cl ...