面试题--在字符串内找到所有不重复的字符。

xuhaijin 2011-09-21 09:22:28
面试题:在字符串内找到所有不重复的字符,如”BWABSDWD”中找出”S”和”A”.考虑时间和空间复杂度。(请用C# 或 Javascript 实现)

我写的算法:

String.prototype.repeatOpt = function () {
var str = this + "",objStr = "";
for (var i = 0; i < this.length; i++) {
var s = str[i];
var newStr = str.replace(s, '');
var j = newStr.indexOf(s);
if (j == -1) {
objStr += s;
}
}
return objStr;
}
alert("BWABSDWD".repeatOpt());

虽然这能实现,但觉得不怎么好,大家有什么好方法。。尤其是说明考虑时间和空间复杂度。
...全文
773 28 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
咸鱼boris 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 xuhaijin 的回复:]

引用 6 楼 sharkdbj 的回复:
JScript code

String.prototype.repeatOpt = function () {
var i=0,str = this,objStr = "";
while(str){
var s = str.charAt(0);
objStr += s;
……


var re = new RegExp(s,"ig……
[/Quote]
regexp = new RegExp(pattern[, flag]);
pattern: 正则表达式字符串。
flag: "i"(ignore)、"g"(global)、"m"(multiline)的组合
i-忽略大小写,g-反复检索,m-多行检索
flag中没有g时,返回字符串,有g时返回字符串数组
ganlu423 2011-09-21
  • 打赏
  • 举报
回复
结果:bghijklmnou 运行时间:0

//运行时间:0
class Program
{
static void Main(string[] args)
{
TimeSpan ts1 = new TimeSpan(DateTime.Now.Ticks);

string car = @"123131341414aaaaaaaaaaaaaaaabcdefghijklmnopqrspuvqwerqweasdafdadadfadfacvcadfdadfadfadfad
wxyzadsfffffffffffasdfasdfdsafsafdsafasfsafsadfsdfsadfsafsdfqwerqwerqwerqewrqwerqwerqwerq
ssdfasdfasdffasdfewrwerwerqweraweasdfasdfadfadqewrqwerqwerddadasdfadfadsfewrqwerqwerqwerq
asdfasdfasdfqwerwesdfasdfasdxcvr234123sdfsddddddddddddddddddddddddddddddddddddddddddddddd
dffffffffffffffffffffffffffffffffffffffffffffffffasdfasdfqw3xcvzxcvasdysdfadfasdfadfadf
wrqwerqwerqwerqwerqwerqwerqwer23423qwerqwerqwerasdfasdfasdfasdfasdfasdfadsfasdfasdfadf
333333333333333333333333333333333333333333333333333qwerqwerqwerffffffffffsdfasdfadfasd
444444444442342341234123412341qwerqewrqersafddddddddddddddddddddddddddddddddddddddddddf
1234123412341234123412341qewrqwerqeqwerqwerqwerqerddddddddddddddddddddddddddddddddddddd
14234123wasdfasdfaaaaaaaaaaaaaaaaaaaaaaaaaaqwerqwerqwerqwerqwerqerqerqerqerqerqewrqerqe";
for (int i = 0; i < car.Length; i++)
{
bool fg = false;
for (int j = 0; j < car.Length; j++)
{
if (i != j)
{
if (car[i] == car[j])
{
fg = true;
break;
}
}
}
if (!fg)
{
Console.Write(car[i] );
}
}

TimeSpan ts2 = new TimeSpan(DateTime.Now.Ticks); //get current ticks.
string spanTotalSeconds = ts2.Subtract(ts1).Duration().TotalSeconds.ToString(); //计算整个程序的运行时间
//整个程序的运行时间
Console.WriteLine("运行时间:" + spanTotalSeconds);
Console.ReadKey();


}
}
tantaiyizu 2011-09-21
  • 打赏
  • 举报
回复

这里给你一个找重复的几种方法:

http://www.scriptlover.com/static/867-javascript-重复字符
JParser 2011-09-21
  • 打赏
  • 举报
回复


<script type="text/javascript" >
var testStr=["123131341414","aaaaaaaaaaaaaaa","abcdefghijklmnopqrspuvwxyz","adsfffffffffffasdfasdfdsafsafdsafasfsafsadfsdfsadfsafsdf"],
tims=1000;
var testWrap=function(fn){
var begin=new Date();
for(var i=0;i<tims;i++){
for(var j=0,len=testStr.length;j<len;j++){
fn(testStr[j]);
}
}
return new Date()-begin;
}

function calc(s) {
var dict = {}, result = [];
s.replace(/(.)(?=.*\1)/g, function(all, c){
dict[c] = true;
return "";
}).replace(/(.)(?!.*\1)/g, function(all, c){
!dict[c] && result.push(c);
});
return result.join("");
}

function myc(str){
var o={},c,s="";
for(var i=0,len=str.length;i<len;i++){
c=str.charAt(i);
o[c]=(o[c]==undefined?1:0);
}
for(var k in o){
o[k]&&(s+=k);
}
return s;
}

console.log("RegExp:"+testWrap(calc));
console.log("Two Traversal:"+testWrap(myc));

</script>


JParser 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zswang 的回复:]

再简化一下
JScript code
function calc(s) {
var dict = {}, result = [];
s.replace(/(.)(?=.*\1)/g, function(all, c){
dict[c] = true;
return "";
}).replace(/(.)(?!.*\1)/g, funct……
[/Quote]
构思不错,但无论从空间复杂度,还是时间复杂度讲,都不是好的算法。
诺维斯基 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 axiheyhey 的回复:]
引用 14 楼 soonfei 的回复:
var dict = {}, result = [];
这一句,是什么意思?
等价于

JScript code
var dict = new Object();
var result = new Array();
[/Quote]

原来是这样啊!!看来,我真得多看看书了!!
xuhaijin 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zswang 的回复:]
再简化一下

JScript code
function calc(s) {
var dict = {}, result = [];
s.replace(/(.)(?=.*\1)/g, function(all, c){
dict[c] = true;
return "";
}).replace(/(.)(?!.*\1)/g,……
[/Quote]

这属于面试题。正则表达式都很难记呢。
峭沙 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 soonfei 的回复:]
var dict = {}, result = [];
这一句,是什么意思?
[/Quote]等价于
var dict = new Object();
var result = new Array();
王集鹄 2011-09-21
  • 打赏
  • 举报
回复
to soonfei:
和这个一样
var dict = {};
var result = [];

这再不明白就得自己多看看书了。
诺维斯基 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zswang 的回复:]
再简化一下

JScript code
function calc(s) {
var dict = {}, result = [];
s.replace(/(.)(?=.*\1)/g, function(all, c){
dict[c] = true;
return "";
}).replace(/(.)(?!.*\1)/g,……
[/Quote]

var dict = {}, result = [];
这一句,是什么意思?
王集鹄 2011-09-21
  • 打赏
  • 举报
回复
再简化一下
function calc(s) {
var dict = {}, result = [];
s.replace(/(.)(?=.*\1)/g, function(all, c){
dict[c] = true;
return "";
}).replace(/(.)(?!.*\1)/g, function(all, c){
!dict[c] && result.push(c);
});
return result.join("");
}
王集鹄 2011-09-21
  • 打赏
  • 举报
回复
function calc(s) {
var dict = {}, result = [];
s.replace(/(.)(?=.*\1)/g, function(all, c){
dict[c] = true;
});
s.replace(/(.)(?!.*\1)/g, function(all, c){
if (!dict[c]) {
result.push(c);
}
});
return result.join("");
}

var data = ["1234123", "abcabcdec", "BWABSDWD"];
var messages = [];
for (var i = 0; i < data.length; i++) {
messages.push(data[i] + ' => ' + calc(data[i]));
}

alert(messages.join("\n"));


1234123 => 4
abcabcdec => de
BWABSDWD => AS
zhchyun2008 2011-09-21
  • 打赏
  • 举报
回复
学习了
峭沙 2011-09-21
  • 打赏
  • 举报
回复
原来不限制使用正则啊。。
		function searchNoRepeat(str){
var ret = [];
for(var i = 0; i < str.length; i++){
var s = str[i],
reg = new RegExp(s + '.*' + s, 'g');
if(!str.match(reg)){
ret.push(s);
}
}
return ret;
}
var result = searchNoRepeat('BWABSDWD');
alert(result);
这个会不会好点
ganlu423 2011-09-21
  • 打赏
  • 举报
回复
但有break; 如果重复的字符很多的哈,应该效率高一点
否则,真是 N的平方。
lioncin 2011-09-21
  • 打赏
  • 举报
回复
貌似都要 N的平方啊
可能 这样不会满足 LZ的需求了
ganlu423 2011-09-21
  • 打赏
  • 举报
回复
不用c#自动函数,这个感觉效率不高,求高人指点

class Program
{
static void Main(string[] args)
{
string car = "BWABSDWD";
for (int i = 0; i < car.Length; i++)
{
bool fg = false;
for (int j = 0; j < car.Length; j++)
{
if (i != j)
{
if (car[i] == car[j])
{
fg = true;
break;
}
}
}
if (!fg)
{

Console.WriteLine(car[i] + "\r\n");
}
}
Console.ReadLine();

}
}
咸鱼boris 2011-09-21
  • 打赏
  • 举报
回复

String.prototype.repeatOpt = function () {
var i=0,str = this,objStr = "";
while(str){
var s = str.charAt(0);
objStr += s;
var re = new RegExp(s,"ig");
str = str.replace(re,"");
}
return objStr;
}
alert("BWABSDWD".repeatOpt());

这样呢?不用遍历整个字符串了,不知道会不会好些?
wishifef 2011-09-21
  • 打赏
  • 举报
回复

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
<script type="text/javascript">
function norepeat(str){
var newStr="";
while(str.charAt(0)!=""){
var fc=str.charAt(0);
var reg=new RegExp(""+fc,"g");
var sl=str.match(reg);
if(sl.length==1){
newStr+=fc;
}
str=str.replace(reg,"");
}
return newStr;
}
alert(norepeat("BWABSDWD"));
</script>
</HEAD>

<BODY>

</BODY>
</HTML>

峭沙 2011-09-21
  • 打赏
  • 举报
回复
你的实现对传入的参数有破坏性操作吧,下面是我的javascript实现,不知道效率怎么样。。
		function searchNoRepeat(str){
var repeat = '',
norepeat = [];
for(var i = 0; i < str.length; i++){
var s = str[i];
if(repeat.indexOf(s) === -1){
last_index = str.lastIndexOf(s);
if( last_index === i){
norepeat.push(s);
}else{
repeat += s;
}
}
}
return norepeat;
}
alert(searchNoRepeat('BWABSDWD'));
加载更多回复(7)

87,997

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧