QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)4 }  k% j5 d* z5 Q' _
    算法:  |  H( q, y9 R2 t3 G$ ?, N" c
       英文是单字节字符,中文是双字节字符,
    & ?1 i. K8 m1 [) F   如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源- E2 E8 x6 n" p5 y: L

    ) g7 M: ]& U1 N& i   假设n个字符里面,有 k个英文单字,i个中文双字
    3 c9 g+ |) Z. W$ B  |* r$ D   那么截取的时候只用考虑最右边的i个的字符
    9 Y& Q- g  a/ g2 {8 [
    & V1 Y4 Q6 }/ S/ j   assume 左边都是英文单字的话,那右边的就全是中文;% H3 p+ Z4 m# H7 c
       如果全是中文,那么有几个中文 就截取几个字符& a, \) c, K. T2 r, o, I4 e: j
    % ^8 M5 I! d- ?. d+ c' Z7 D. |
    迭代的函数 输入应该是字符串,输出应该是左起的n个字符
    0 Y# b) \8 J0 P! W6 M, j8 r* D, g迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)
    1 a$ X  F( m6 T$ o/ w) B) h7 b  b$ G! w5 H6 x! V; j! [
    迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
    6 j' A6 w( h% C, [' G2 |-------------------------------------------------------------------------------------------------------
    4 H9 V( ?4 Q8 D- H' X3 _if(!String.prototype.leftB){ 0 y$ T6 R7 t9 b. I' N7 x
    String.prototype.leftB = function(n){ //n=7
    ' V3 w! Z2 i; ~1 m8 i  K1 h% {' F2 `var s = this, //s="ilove我自己"
    * J8 P1 \9 M5 s/ r  y+ C3 j5 @/ hs2 = s.slice(0, n), //s2="ilove我自"
    4 j+ _3 p' q1 V, b/ j# V" q: [i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=95 w& j' O  B5 g7 f9 U
    if (i <= n) { ' v' e/ N/ o5 |- n$ m
    return s2; k1 n* L9 r5 `4 N9 Y/ J! g; X: P; o
    }
    8 ^" G: h+ J+ x& }% U1 [' T9 E8 ai -= s2.length;// i=9-7=2 , n =7,几个中文2 H- \' P3 _5 a1 y* p
    switch (i) {
    % C6 G% N3 p3 p$ Jcase 0: return s2; //全是单字节/ {) i' _( A+ h- s8 p$ l# I, g# |
    case n: return s.slice(0, n >> 1); //全是双字节,比如中文# F( j" J$ z' k  m: n  F3 s+ z
    default: 5 j" }( l$ Y8 A1 o- C
    var k = n - i, //k=7-2=5,几个英文字4 @0 T- M' w9 K5 P
    s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"! U! y: R4 B/ m' ~0 e) [$ Q1 q
    j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
    8 b: f& C! Z& y# Z- t6 W) l* ^return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!. Z0 P: f+ q& a& u6 J  p' O
    } 4 J6 n7 l/ E7 j$ n& U; c6 }5 O! e
    } 2 y! Y* c% v/ `) a* O. P2 |" V6 \) ^
    }* t  n3 E- ^1 Q" Z7 i
    -----------------------------------------------------------------------------------------------------------------5 S. F7 y3 q: H+ Q
    var stringify = function (obj) {( M5 r7 {3 b2 I* L' n( }: T
        var t = typeof (obj);0 ?% R$ ~* f. J: X; L% \' t0 H
        if (t != "object" || obj === null) {- m4 k( k6 J1 b+ g1 L( x( y8 ?4 w
            // simple data type
    + P( o5 U3 D2 D6 q$ p) E4 E3 v' n$ S        if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
    " b, S2 F/ T) a+ p( H4 M        return String(obj);
    " a: F" i% m$ j  f1 C- G+ S' A    } else {" P" t! Y3 D2 I$ U2 L/ c7 W- ]7 H
            // recurse array or object
    0 h; j" D. `1 t        var n, v, json = [], arr = (obj && obj.constructor == Array);
    % Z! b( Q+ s( |5 p8 ?4 Y; e3 X$ W  i. I5 b' T
            // fix." n; K6 n9 V8 u0 T6 ?
            var self = stringify;
    $ G' `- G% J2 M  c; Y* `% E' r' D7 [; V' H
            for (n in obj) {, v3 {& X( `7 G# X0 C
                v = obj[n];" [  F; ^' T: G0 [1 v
                t = typeof(v);' m) `- m* b/ R
                if (obj.hasOwnProperty(n)) {
    2 r, ^* O5 [8 o8 J" W% z( |% W                if (t == "string") {) n/ g' m- a6 s" B0 v
                        v = '"' + v + '"';
    ! Z: p4 `  ?1 N' U) e6 L- i+ Z                } else if (t == "object" && v !== null) {
    ' t$ y2 c. ~, R3 s                    v = self(v);/ k: V: z0 f4 L0 f3 |
                    }
    + j! o. X+ h* [# d1 Q1 W: a                json.push((arr ? "" : '"' + n + '":') + String(v));
    & |5 M- I# K$ O% `. Y            }% q8 U6 K0 j' O9 _
            }4 F0 ]1 [( t# h! @* v
            return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");- O; I' P0 U& h4 F/ S
        }5 U! b9 M4 W7 A2 n% H; {3 x% \
    };/ L2 L( h5 c2 j" e

    4 z% a; |' p$ N( a6 }/ ]/ ]: h, D
    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-23 02:49 , Processed in 0.524265 second(s), 51 queries .

    回顶部