码迷,mamicode.com
首页 > 编程语言 > 详细

JavaScript--面试--算法--字符串-3

时间:2016-03-27 22:29:58      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:

问题描述: 利用字符串中字符出现的重复次数,实现一个最简单的字符串压缩,所压缩后字符串没有变短,则返回原来的字符串,

例如abbbcccccddef,压缩之后为ab3c5d2ef;在字符串足够大(大于1000万个字符),要考虑效率问题;

function compress_str(str) {
    var tmp_char = str.charAt(0);
    var count = 1;
    var tmp_str = ‘‘;
    var index = 0;
    for(var i=1; i<=str.length; i++){
        if(!str.charAt(i) || str.charAt(i) != tmp_char) {
            tmp_str = tmp_str + tmp_char + (count > 1 ? count : ‘‘);
            tmp_char = str.charAt(i);
            count = 1;
            index ++;
        } else {
            count ++;
        }
    }
    if(index == str.length) return str;
    return tmp_str;
}

var str1 = ‘abcdedf‘;
console.log(str1 + ‘ compressed is ‘ + compress_str(str1));
var str2 = ‘abbbcccccddefbbb‘;
console.log(str2 + ‘ compressed is ‘ + compress_str(str2));

    在js里字符串一旦赋值后不能修改
    基于这个背景看一下字符串连接操作:

var str ;
str = ‘this is a string‘;
str = str + ‘,another string.‘;

     对于这个连接操作JS的处理机制是:新建一个临时字符串,将新字符串赋值为 str + ‘,another string.‘ ,然后返回这个新字符串并同时销毁原始字符串。所以字符串的连接效率较低。提高效率的办法是用数组的join函数

var tempArr = [] ,src,res;
src = ‘this is a string‘;
tempArr.push(src);
tempArr.push(‘,another string.‘);
res = tempArr.join(‘‘);

不过在《JavaScript高级程序设计》里也提到:
     这个过程是在后台发生的,而这也是在某些旧版本的浏览器(例如版本低于1.0的FireFox、IE6等)中拼接字符串是速度很慢的原因。但这些浏览器后来的版本已经解决了这个问题。
    所以效率提高也只是在IE6 等低版本的浏览器中有效。

    因此,为了提高效率,我们需要做进一步的改动,我们使用字符串数组来代替字符串拼接

function compress_str_2(str) {
    var tmp_char = str.charAt(0);
    var count = 1;
    var tmp_arr = new Array();
    var index = 0;
    for(var i=1; i<=str.length; i++){
        if(!str.charAt(i) || str.charAt(i) != tmp_char) {
            tmp_arr.push(tmp_char)
            if( count > 1)  tmp_arr.push(count);
            tmp_char = str.charAt(i);
            count = 1;
            index ++;
        } else {
            count ++;
        }
    }
    if(index == str.length) return str;
    return tmp_arr.join(‘‘);
}

var str1 = ‘abcdedf‘;
console.log(str1 + ‘ compressed is ‘ + compress_str_2(str1));
var str2 = ‘abbbcccccddefbbb‘;
console.log(str2 + ‘ compressed is ‘ + compress_str_2(str2));

 

JavaScript--面试--算法--字符串-3

标签:

原文地址:http://www.cnblogs.com/ppyst/p/5327101.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!