QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |正序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)
    8 H  F3 X8 @- ?1 l1 O4 D0 y算法:* Y3 d. |+ F$ ]
       英文是单字节字符,中文是双字节字符,
    4 c% s) @* T. E, e0 ?; D. v! M   如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源
    8 r0 `) G% P4 }7 y5 _+ m: a
    ( F( Y% `9 v0 I9 B9 H' \+ x' o3 \8 _   假设n个字符里面,有 k个英文单字,i个中文双字
    ) t6 O; x3 d- _" J+ @( O5 e   那么截取的时候只用考虑最右边的i个的字符8 J% Q, v6 G. Y& J# W; a. f& r

    3 y9 U, R5 Z. N; t6 m   assume 左边都是英文单字的话,那右边的就全是中文;
    1 S: B) D& F; N& a   如果全是中文,那么有几个中文 就截取几个字符9 F& h) x- D' [/ _5 G4 `. I- I. m7 U) ?  H
    & h* x& D% q* I4 T2 m6 J
    迭代的函数 输入应该是字符串,输出应该是左起的n个字符
    2 q0 T( ~4 l1 ^迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)
    7 x  H/ E3 x' a% a9 J, [) m9 |  z6 W$ v4 u* k9 Q4 C
    迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代/ J; H1 R) s. x
    -------------------------------------------------------------------------------------------------------
    $ a4 @& m9 ]4 r% |+ t+ [if(!String.prototype.leftB){ 7 q  y6 G5 h: j' t! X( @- F6 D) ^
    String.prototype.leftB = function(n){ //n=7
    1 C6 ?# ]2 X2 l# \var s = this, //s="ilove我自己"
      n! D- b/ f, |, Q# Q0 x0 is2 = s.slice(0, n), //s2="ilove我自"
    # I0 U: v& ]; Q2 ]1 g. g0 e9 ji = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9( R9 x# G. W$ X$ Q
    if (i <= n) {
    - s, _; e  R; K9 kreturn s2; k. i9 I9 t+ [$ N4 z  U0 ?" T
    }
    5 ~; E0 z8 j9 _" li -= s2.length;// i=9-7=2 , n =7,几个中文
    3 V) o9 k  c' ?- N- ?switch (i) { # I9 }" |6 `% m: i
    case 0: return s2; //全是单字节
    . X' z, V4 W6 Q/ _8 T" a& ~case n: return s.slice(0, n >> 1); //全是双字节,比如中文
    * O0 U% R2 S* Q+ e9 A9 _default: 9 M9 _9 X$ w* I
    var k = n - i, //k=7-2=5,几个英文字
    , L* e% |; v. O3 }0 j' Ds3 = s.slice(k, n), //s.slice(5, 7) s3=我自"0 s6 t6 O: ~* v
    j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数4 m; T! S) q2 O3 H4 D( l/ J' s3 M
    return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!3 t" i( b" `/ n4 D
    }
    & V6 f: ]: Z' h3 k}
    * J1 b2 k" {2 \1 {: M/ T}
    - i9 \& S/ Z$ J6 T- ^-----------------------------------------------------------------------------------------------------------------
    1 j( b6 s5 f0 i4 [% x: q4 Xvar stringify = function (obj) {- q& a) K0 ]! s7 c: ?
        var t = typeof (obj);
    7 n, ?+ {( \, U9 d6 l: V" R    if (t != "object" || obj === null) {* X7 N+ J2 z/ {: i
            // simple data type
    2 ?# A; l4 J% M  F        if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
    0 q/ z4 A2 t% @1 Q6 F        return String(obj);% Z# F' W" v- E. M2 d# @
        } else {
    / P8 o* g0 ]& [; a% B! o        // recurse array or object
    $ c+ r+ o4 v: u1 Q" W        var n, v, json = [], arr = (obj && obj.constructor == Array);) ~9 ]6 y, B9 L6 z& B6 b- I# G/ {% n) {

    7 r; m5 z9 @3 a        // fix.& P5 N! r0 ]+ \! N2 @6 Q
            var self = stringify;/ V5 V! m+ d# B- s0 z) P
    * H( Y2 U! g: J7 f* x( Y" l$ Z3 j
            for (n in obj) {6 S9 i: ~% L1 O' x* R" |
                v = obj[n];
    , Z/ _0 o4 W8 i2 C6 t; g* o* |$ ^            t = typeof(v);: d2 S; {: T( ?7 f& A
                if (obj.hasOwnProperty(n)) {6 J$ c! \, G8 b: @; j
                    if (t == "string") {* j) I- f+ T4 W3 X& b; R) O
                        v = '"' + v + '"'; " s, a5 y, n, x3 }% W* y& a1 ~
                    } else if (t == "object" && v !== null) {
    * I) x" n* v8 B; t6 i$ A                    v = self(v);+ z7 _3 @% C. h. T
                    }
      B! p2 n9 I7 {: T                json.push((arr ? "" : '"' + n + '":') + String(v));
    , Z- Z3 M1 F( [$ e            }" V4 F* u, H# a# f) x
            }. `& e4 l' y2 E1 u
            return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
    6 i* _: q; J9 F/ Z! d/ k# h    }
    0 F+ y$ {3 h" d- v};8 l  R5 M4 M. T# p4 r# C" \
    ( h/ B6 B3 }/ q) r  J  g& f  }$ {
    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-25 12:12 , Processed in 0.459836 second(s), 50 queries .

    回顶部