QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1642|回复: 0
打印 上一主题 下一主题

递归

[复制链接]
字体大小: 正常 放大

14

主题

10

听众

43

积分

升级  40%

  • TA的每日心情
    慵懒
    2015-5-5 09:46
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)  {6 ~0 V) R7 R1 @3 e* q$ `
    算法:" Y& M6 ?$ m+ n! Y! R* ^8 `2 G; u
       英文是单字节字符,中文是双字节字符,: H! B3 J% K5 _4 l7 ^
       如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源4 d% K3 T/ F4 K( Q* y( P

    ( h# V' I/ z; P0 F! f3 f  r/ d   假设n个字符里面,有 k个英文单字,i个中文双字
    ; a) N2 |1 m4 ?& t2 y   那么截取的时候只用考虑最右边的i个的字符
    . N2 A3 G9 f6 Y$ ?0 @# B/ U+ o+ V" X  F3 o+ F0 x' K8 ^9 L
       assume 左边都是英文单字的话,那右边的就全是中文;
    ; Q! u  T2 g: y7 ]   如果全是中文,那么有几个中文 就截取几个字符
    9 s3 c& C1 j( C  ~4 j2 ~
    - A; O& F  }! f  X- o2 S迭代的函数 输入应该是字符串,输出应该是左起的n个字符2 ^( h% m5 R" e
    迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)0 Y; r. Z# p+ j7 E( h1 ]

    & V7 k4 ]1 U$ I5 N( U" j- X- P4 {迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
    . {& `# t. R( x. t3 e4 c-------------------------------------------------------------------------------------------------------7 c; m/ P; t! M' C7 x7 n
    if(!String.prototype.leftB){
    / N/ @- B+ [" j  ^" wString.prototype.leftB = function(n){ //n=7% E# S* b8 M# z
    var s = this, //s="ilove我自己"
    ! A. O4 f5 P2 K( ?s2 = s.slice(0, n), //s2="ilove我自"5 c" ^# m! q  {. T5 F/ F( B! a0 |4 X
    i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9+ Q# i, f' F& z9 I
    if (i <= n) { ! A$ B' w0 H1 Z5 {; w2 y
    return s2; k& }9 M8 J! {5 q$ X
    } : j3 q; s- I# P7 c, Z1 i
    i -= s2.length;// i=9-7=2 , n =7,几个中文' @8 ~; Z) I9 V) \
    switch (i) { 4 p) y- `' U, F, K9 ?  W
    case 0: return s2; //全是单字节2 t. h- w; X$ ~! k. U% ^
    case n: return s.slice(0, n >> 1); //全是双字节,比如中文, u& |- a9 G1 b1 A% J4 u
    default:
    / N# h5 j* y9 v" Lvar k = n - i, //k=7-2=5,几个英文字
    1 u6 C( n8 Q# ^s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"( K: d) A! r* ?& I1 @; j) o
    j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
      l- _* g' `0 d6 I  k- ~0 qreturn j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!$ j, }2 O8 p; _1 ?. n: p  z, a
    }
    / x; [/ O6 y0 P$ R} " l- k9 K& n2 @( q4 l7 i
    }
    & @$ g, k+ l8 _, |% k2 Y0 Y$ u-----------------------------------------------------------------------------------------------------------------$ d8 v9 E0 E( N0 T$ D8 P
    var stringify = function (obj) {! v9 v/ o/ q5 n
        var t = typeof (obj);9 K+ g( {+ n: ~- Z) Z
        if (t != "object" || obj === null) {
    2 S% g5 d5 B7 V% k        // simple data type
    % C# s) D8 o( E) t        if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!4 q  p3 o# I8 }/ c5 b
            return String(obj);( e$ ^3 @" s7 w4 ~; ^' W/ o: x
        } else {
    " g/ r! v# r, U5 F% p        // recurse array or object
    & @: R2 y) j; x' h  e1 r        var n, v, json = [], arr = (obj && obj.constructor == Array);
    8 P5 ?8 R9 u" {: L# z( t: L, e# I$ r8 Z3 y. m+ |% m  N  b
            // fix.6 F: }- p# i; L& B
            var self = stringify;" B  S1 a1 a4 L( T" t# J
    & @8 ^1 l/ a8 _1 ^
            for (n in obj) {
    - a% A$ v" T' ^% H5 S            v = obj[n];
    : ?1 h! i3 B1 H# }3 D3 D) ~            t = typeof(v);
    $ z! Q; @* G" ?. ~            if (obj.hasOwnProperty(n)) {, M3 p0 U# K! u
                    if (t == "string") {
    8 Q1 O7 b7 ~' `5 H8 z. |                    v = '"' + v + '"';
    ! A1 p8 A. K! l) H( ^, Q                } else if (t == "object" && v !== null) {1 Z+ P& r  J7 d
                        v = self(v);
    " [) |; q9 @  u* f                }
    ' A- t, g4 M4 [" z" Z                json.push((arr ? "" : '"' + n + '":') + String(v));
    1 ^" _- {# ^5 @  `: {            }
    ) x+ X$ [$ L- u4 B        }" D. D1 R/ V4 D2 W1 L
            return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
    , c! l4 h/ o2 v    }( O) v( H( n1 o8 S5 U1 D
    };9 H9 H; v  x) }& @/ u  S1 y

    ; P; A9 B6 i- ]1 F2 F2 m( W& Q8 u9 n2 a' j
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-10-24 21:53 , Processed in 0.350615 second(s), 49 queries .

    回顶部