【题目】

原文:

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. opencv(0)安装与配置

    1.windows下 1.1 exe安装 windows下可以安装opencv的exe版本,已经编译好了,很省事. 到https://opencv.org/releases.html下载需要的open ...

  2. LanguageTag

    LanguageTag */--> div.org-src-container { font-size: 85%; font-family: monospace; } pre.src { bac ...

  3. C#连接mariadb代码及方式

    不负责任的说MariaDb和MySQL很多都是通用的,因为来自同一个爹... 和MySQL连接方式差不多 首先配置好你的MariaDb,创建test数据库,在test里创建MyTable表,脚本如下( ...

  4. C++之客户消费积分管理系统

    之前数据结构课程设计要求做这么一个小程序,现在贴上源码,来和大家进行交流学习,希望大家给出意见和建议 程序以链表为主要数据结构对客户信息进行存储,对身份证号码判断了位数及构成(前十七位为数字,最后一位 ...

  5. HTML--1

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. 7-13 Power Calculus 快速幂计算 uva1374

    想到快速幂  但是这题用不上 用迭代加深搜索 注意启发函数为  当前最大数<<(maxx-d)  如果大于n则剪枝 注意跳出语句的两种写法   一种170ms  一种390ms !!! d ...

  7. WCF服务发布到IIS中去(VS2013+win7系统)

    第一个WCF程序 1. 新建立空白解决方案,并在解决方案中新建项目,项目类型为:WCF服务应用程序.建立完成后如下图所示: 2.删除系统生成的两个文件IService1.cs与Service1.svc ...

  8. 实现Ecshop注册页面手机号唯一的验证

    如果Ecshop实现了用手机号码来登陆,那么就需要在注册时保证会员所填写的手机号是唯一的,也就是说手机号还未被注册,那么该怎么来检测填写的手机号是否注册过了呢? 一.参考ecshop检测邮箱 因为注册 ...

  9. ref:详解MYSQL数据库密码的加密方式及破解方法

    ref:https://blog.csdn.net/paul123456789io/article/details/53081921 MySQL数据库用户密码跟其它数据库用户密码一样,在应用系统代码中 ...

  10. python: 模型的统计信息

    /*! * * Twitter Bootstrap * */ /*! * Bootstrap v3.3.7 (http://getbootstrap.com) * Copyright 2011-201 ...