标签:
问题描述: 利用字符串中字符出现的重复次数,实现一个最简单的字符串压缩,所压缩后字符串没有变短,则返回原来的字符串,
例如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));
标签:
原文地址:http://www.cnblogs.com/ppyst/p/5327101.html