面试题:在字符串内找到所有不重复的字符,如”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());  虽然这能实现,但觉得不怎么好,大家有什么好方法。。尤其是说明考虑时间和空间复杂度。

解决方案 »

  1.   

    var s = str[i];楼主直接 这样用在字符串上 ie 不兼容,,时间和空间复杂度,,,期待。
      

  2.   

    你的实现对传入的参数有破坏性操作吧,下面是我的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'));
      

  3.   


    <!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>
      

  4.   


    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());  这样呢?不用遍历整个字符串了,不知道会不会好些?
      

  5.   

    不用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();
     
            }
        }
      

  6.   

    貌似都要 N的平方啊
    可能 这样不会满足 LZ的需求了
      

  7.   

    但有break; 如果重复的字符很多的哈,应该效率高一点
     否则,真是 N的平方。
      

  8.   

    原来不限制使用正则啊。。 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);这个会不会好点
      

  9.   

    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
      

  10.   

    再简化一下
    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("");
    }
      

  11.   


    var dict = {}, result = [];
    这一句,是什么意思?
      

  12.   

    to soonfei:
    和这个一样
    var dict = {};
    var result = [];
    这再不明白就得自己多看看书了。
      

  13.   

    等价于var dict = new Object();
    var result = new Array();
      

  14.   

    <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>
      

  15.   


    这里给你一个找重复的几种方法:http://www.scriptlover.com/static/867-javascript-重复字符
      

  16.   

    结果: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();
                         }
        }
      

  17.   

    没考虑什么时间空间的JS最简洁版
    var str ="123131341414aaaaaaaaaaaaaaaabcdefghijklmnopqrspuvqwerqweasdafdadadfadfacvcadfdadfadfadfadwxyzadsfffffffffffasdfasdfdsafsafdsafasfsafsadfsdfsadfsafsdfqwerqwerqwerqewrqwerqwerqwerqssdfasdfasdffasdfewrwerwerqweraweasdfasdfadfadqewrqwerqwerddadasdfadfadsfewrqwerqwerqwerqasdfasdfasdfqwerwesdfasdfasdxcvr234123sdfsddddddddddddddddddddddddddddddddddddddddddddddddffffffffffffffffffffffffffffffffffffffffffffffffasdfasdfqw3xcvzxcvasdysdfadfasdfadfadfwrqwerqwerqwerqwerqwerqwerqwer23423qwerqwerqwerasdfasdfasdfasdfasdfasdfadsfasdfasdfadf333333333333333333333333333333333333333333333333333qwerqwerqwerffffffffffsdfasdfadfasd444444444442342341234123412341qwerqewrqersafddddddddddddddddddddddddddddddddddddddddddf1234123412341234123412341qewrqwerqeqwerqwerqwerqerddddddddddddddddddddddddddddddddddddd14234123wasdfasdfaaaaaaaaaaaaaaaaaaaaaaaaaaqwerqwerqwerqwerqwerqerqerqerqerqerqewrqerqe"
    function getNoRepeat(s) {
    return s.length? s.split('').sort().join('').replace(/(.)\1+/g, '') : '';
    }
    alert(getNoRepeat(str));
      

  18.   


    var re = new RegExp(s,"ig");
    这句ig啥意思?
      

  19.   


    String.prototype.repeatOpt = function() {
    var o = {}, len = this.length, ret = [];
    for(var i = 0; i < len; i++){
    c = this.charAt(i);
    if(!o[c]){
    o[c] = 1;
    }else{
    o[c]++;
    }
    }
    for( c in o){
    if(o[c] == 1){
    ret.push(c);
    }
    }
    return ret.join('');
    };
    alert("BWABSDWD".repeatOpt());
      

  20.   


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

  21.   

    regexp = new RegExp(pattern[, flag]);
    pattern:  正则表达式字符串。
    flag:     "i"(ignore)、"g"(global)、"m"(multiline)的组合
    i-忽略大小写,g-反复检索,m-多行检索   
    flag中没有g时,返回字符串,有g时返回字符串数组