About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • Apr

    15

    删除与某个字符相邻且相同的字符(博彦面试题算法,据说这算法也是全国计算机等级考试C++语言的必考的题目之一)。比如“fdaffdaaklfjklfja”字符串处理之后成为“fdafdaklfjklfja”。我写了一个较简单的ActionScript 2的版本算法。
     

    var str = "someString";//someString替换成任意非空字符串
    var strTemp = "";
    for (var i=0,j=i+1; j<=str.length; j++, i++) {
        if (str.charAt(j) != str.charAt(i)) {
            strTemp = strTemp+str.charAt(i);
        }
    }
    str = strTemp;
    delete strTemp;
    trace(str);

    再对版本扩展一下,删除非空字符串中任意相邻却相近的特殊字符,比如半角空格和全角空格:
     

    var str = "someString";//someString替换成任意非空字符串
    var strTemp = "";
    for (var i = 0, j = i+1; j<=str.length; j++, i++) {
        if (str.charAt(i) != " " && str.charAt(i) != " " || str.charAt(j) != str.charAt(i)) {
            strTemp = strTemp+str.charAt(i);
        }
    }
    str = strTemp;
    delete strTemp;
    trace(str);


    没有使用递归,是因为其它某些语言中对递归算法没有作次数限制,但在ActionScript中因为对递归函数作了次数限制,递归深度不可超过256级,否则FLASH播放器会将递归函数作为无限循环(死循环)而中止,一篇文章一般不止256个字;另外据ActionScript白皮书介绍,递归算法的速度比非递归的速度要更慢。

    (这里只是提供ActionScript2版本,以供不能使用ActionScript3 RegExp 功能的人参考,因为现在的电子杂志制作软件和组件大多都只支持ActionScript2,如某些人可能要制作电子杂志的搜索插件,可能就需要用到上面的对多个空白字符或回车符等处理的算法。)