QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况); D9 e9 R# C6 O- U+ a/ M: r
    算法:) A$ r( p9 ?) F; a
       英文是单字节字符,中文是双字节字符,' G7 \8 T: b  f, K) I9 M- W- ^6 W! \
       如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源" N2 j: a& x& X6 I
    & H" K: A& F3 i3 W( |! d  e
       假设n个字符里面,有 k个英文单字,i个中文双字9 c3 S+ J7 e9 ]
       那么截取的时候只用考虑最右边的i个的字符
    3 W- C) ?* N8 x& D+ z% I, v5 V3 M$ S6 b% b
       assume 左边都是英文单字的话,那右边的就全是中文;
    . _2 r; r3 m" u   如果全是中文,那么有几个中文 就截取几个字符+ d/ V; t: d$ ]0 r
    8 O; a& ~9 j5 B) {# w# M
    迭代的函数 输入应该是字符串,输出应该是左起的n个字符
    / |" Z& H$ H, N! _迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)
    / G/ h' H4 i: R/ \
    0 R$ b5 m6 k5 l3 m( V  P! j迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
    * `* o6 x) O, }( ~  X-------------------------------------------------------------------------------------------------------/ s2 v) _9 [- e- g
    if(!String.prototype.leftB){ ! T" L6 a2 j& _- c1 V/ X* V
    String.prototype.leftB = function(n){ //n=7+ ]# m" u; S7 O0 f' W' R
    var s = this, //s="ilove我自己"
    ! w6 M) B5 B8 Q- x# p0 @0 k% p! A  j/ ]s2 = s.slice(0, n), //s2="ilove我自"0 J% ]) B" H% ]. o6 z8 y
    i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9  {' z: k0 X- P$ ?
    if (i <= n) {
    * P2 G3 w0 N3 Dreturn s2; k
    ( `, {. Z  ?0 I4 A( d" J% z$ O} 0 @& r% H3 e& S; C! y' V7 \
    i -= s2.length;// i=9-7=2 , n =7,几个中文
    1 a. h' N1 v5 L( ^6 |2 p9 `switch (i) {
    + g4 f6 U! t- l" Ccase 0: return s2; //全是单字节
    $ x" C; V. Z9 dcase n: return s.slice(0, n >> 1); //全是双字节,比如中文
    * x  s3 X7 u9 J1 Odefault: - O5 L1 v5 I" P4 N) z
    var k = n - i, //k=7-2=5,几个英文字. K! T- }( M, K" a, r# @
    s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"( G6 Q& s9 K3 j  F' ^
    j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
    ! z; `% S" _( p, c# |) oreturn j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
      c4 B. ~5 B1 d# E, l} 9 o+ x: i; H; T( J- Y
    } & b0 |* {3 W+ R$ f, P
    }
    + _( F3 b) Y0 ~# c-----------------------------------------------------------------------------------------------------------------2 g, D) Q0 r) n' Q( }. g/ [- v
    var stringify = function (obj) {' t7 O( s& Q+ z; _5 P% g& Y9 D
        var t = typeof (obj);
    ; f: n% U6 Z2 r" z: [* l$ J    if (t != "object" || obj === null) {
    0 L3 h! k( z2 Y& O+ R        // simple data type
    6 r- Y$ T' x( f3 T3 h9 [        if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
    6 f; I' N/ V& Z7 B        return String(obj);
    2 X( q  b6 H" M7 m' x: O3 ^) t    } else {
    $ l' p8 F. f& a! U3 w' e        // recurse array or object
    & U1 b8 o% ~  r  `5 b2 ~& W        var n, v, json = [], arr = (obj && obj.constructor == Array);/ @5 T' G2 }8 }$ ?

    % q7 t: S, [/ u1 a+ l9 j7 F: P        // fix.
    : Q2 `' n8 J7 I% [* W' }& l1 {        var self = stringify;9 r& v* g: K# Z6 N

    ; P4 L- h8 }' j, V' O        for (n in obj) {) T, ?0 C" Z* B1 |
                v = obj[n];
    ; H% y+ v: c0 d* i1 F2 x            t = typeof(v);
    ! V, {$ |0 y4 t/ F4 E5 P- D$ M) X            if (obj.hasOwnProperty(n)) {; C" V3 o# y, P. _, V1 R) p7 ^$ [5 E
                    if (t == "string") {& b( F/ V% B- B" Y
                        v = '"' + v + '"';   [2 Y5 b, c2 Z" X7 _
                    } else if (t == "object" && v !== null) {% V8 _' f) R' Y$ U4 _& _
                        v = self(v);
    * Q0 T8 U- K% c! X6 Y                }
    5 E  B, ~; ]2 `                json.push((arr ? "" : '"' + n + '":') + String(v));! H, v. y6 l) b3 X  p& c5 H* o* c
                }* T/ y' ?7 E& ?6 w$ _4 w% u. R
            }9 E) ]) u( z$ C
            return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
    / V4 A- T# W; M0 e( C- |1 T$ g    }6 W# K$ K0 O6 q* M& N
    };
    3 g( L# G# G+ O* w. D- j! ?! y& G  n3 t
    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-6-12 09:22 , Processed in 0.313075 second(s), 50 queries .

    回顶部