QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)1 A8 H6 f  J0 c0 c( u# t. A
    算法:4 Q4 S% z2 Z; P) R- c
       英文是单字节字符,中文是双字节字符,; }7 l; A0 [4 q( F6 @
       如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源$ z: ^5 q& S+ y/ u% B: w  l" j
    1 d8 R, P1 a4 H. ?
       假设n个字符里面,有 k个英文单字,i个中文双字+ a; @. M9 S# y
       那么截取的时候只用考虑最右边的i个的字符1 D7 h, s' }4 h% Q! C6 z

    2 J, U2 O% O# y2 x' X   assume 左边都是英文单字的话,那右边的就全是中文;
    3 z# ]7 H4 j& @. O' J1 `7 ^   如果全是中文,那么有几个中文 就截取几个字符
    8 D+ {( Q" X/ S9 Z! V8 i, y+ p& b: n1 Z6 [% n# |, e
    迭代的函数 输入应该是字符串,输出应该是左起的n个字符
    + G  Z# z2 Z, G2 g, ?. U迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)) _+ X! L+ n8 ?1 F8 o- }
    - x6 b0 }0 p2 ]  W' P
    迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代) h5 E* w/ p, l! @8 o
    -------------------------------------------------------------------------------------------------------
    ( v0 Y7 Y; f1 x# k2 Sif(!String.prototype.leftB){
    ) d- U- E6 j' I; n# _String.prototype.leftB = function(n){ //n=7
    - G3 ?7 w1 }* t  }var s = this, //s="ilove我自己"
    . {* n8 a9 i: I# G- v6 Ds2 = s.slice(0, n), //s2="ilove我自"# @- W8 f5 C$ `5 A* O
    i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=92 q. E, H" Q/ d
    if (i <= n) { & F' N- [1 ?& \5 d
    return s2; k
    0 i; w( F* t) @. a+ P} ) h, Q' c" a) ~! x
    i -= s2.length;// i=9-7=2 , n =7,几个中文
    3 Z0 C. ]- R; H5 h1 I% S$ e5 }switch (i) { 0 L1 {2 J  }2 q: ^* @) E% s2 u% L7 s
    case 0: return s2; //全是单字节* f% M8 @* A2 n8 g3 V, z
    case n: return s.slice(0, n >> 1); //全是双字节,比如中文
    & J% R1 |( ^9 t$ I) K0 @% H, Fdefault:
    6 ?- m9 {/ O2 @) ?2 t- avar k = n - i, //k=7-2=5,几个英文字
    0 t- T+ W+ P6 b- c  E2 O+ H% qs3 = s.slice(k, n), //s.slice(5, 7) s3=我自": K( I4 t  z8 e# P, X( \
    j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
    8 v, {2 j, t3 Ireturn j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!3 f* d' U. Q$ f6 |; e# f. I' F
    } ) z6 P( b" v7 K3 ?- @
    }
      ]$ N9 Z6 T- ~# f7 w8 b}
    $ D0 h' Z1 t6 G-----------------------------------------------------------------------------------------------------------------3 |' m9 ~0 v5 U0 f: d8 k* f
    var stringify = function (obj) {
    9 r3 }, ]( m5 r( p8 }6 N    var t = typeof (obj);
    1 e6 a3 a* Q# B) z    if (t != "object" || obj === null) {
    $ s/ U& Y! w/ |; o7 [( z        // simple data type
      i! v" Q, \" i% f: u& N2 w  H        if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
    9 C$ I) l" q/ e7 ^        return String(obj);- @8 F1 G. p) n# P
        } else {
    1 N3 `' ?( T9 W: b  @! G0 o; \        // recurse array or object
    8 ?  ]: a9 {3 p0 A        var n, v, json = [], arr = (obj && obj.constructor == Array);: `! c# U: n& G3 y

      p; u2 q# ?7 I1 A# e) M7 L' F        // fix.
    8 C( p9 N9 C* \/ [2 D( N        var self = stringify;
    % l) e- b- l! X
    4 {. c& l7 I9 x        for (n in obj) {4 e  I) H+ Y6 a8 v' U1 `
                v = obj[n];
    ! ^+ k8 A5 ?& e+ e3 Q$ e+ t            t = typeof(v);
    3 \4 I/ D3 \. S! l            if (obj.hasOwnProperty(n)) {
    2 W7 ^: R2 {4 b                if (t == "string") {3 v+ `3 K# K7 R; S/ O2 H* C
                        v = '"' + v + '"';
    : z) z2 p, H( \. E                } else if (t == "object" && v !== null) {- k: M% g: }0 t* p+ b) @
                        v = self(v);, U) D8 D/ S! g/ P% W; D
                    }  e) k/ J$ n( d6 i" e1 e# H
                    json.push((arr ? "" : '"' + n + '":') + String(v));
    9 u" r( b" X+ L6 A- K3 |* D, ~            }( F1 O% m( d; c% R
            }
    , h" D' P0 O, ~  D        return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");7 k3 R6 H/ ~% U3 a! y0 A$ H
        }
    & `$ X" Y' g! M& C! b+ z6 M};
    ! K& q0 J. A, B+ R
    0 X9 t' `5 y- N/ `9 G0 Q
    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, 2026-4-15 11:11 , Processed in 0.419521 second(s), 49 queries .

    回顶部