QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |正序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)
    & W$ @! Y6 i2 J) F9 y" T5 r; [算法:! x, q/ L* F7 i0 ~
       英文是单字节字符,中文是双字节字符,
    & e! l- j3 C- \. s1 D. V- T0 Y   如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源
    2 I& B" r% y% m$ M* V' r  z+ u. Y( P" g9 E5 k+ }# B
       假设n个字符里面,有 k个英文单字,i个中文双字# B; Z6 p: L" W8 s
       那么截取的时候只用考虑最右边的i个的字符
    ! N, q! i0 K5 x" U" Q& Y! J, C6 {! Q, _  L0 E. h9 M* f9 b  M. R
       assume 左边都是英文单字的话,那右边的就全是中文;
    ; J$ ]% |% T; y" p   如果全是中文,那么有几个中文 就截取几个字符
    ( m3 j( m! R$ a" `8 j, F
    ; U( n& w% z- h2 H2 x' F迭代的函数 输入应该是字符串,输出应该是左起的n个字符  ~6 J4 I' G' `$ w
    迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)- d& H6 L% g1 g9 G! [6 _  f
    1 s; y- Z/ `* P
    迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代; h' F  Y% x  T3 V; [+ o: T& |
    -------------------------------------------------------------------------------------------------------
    9 @* i0 i1 @7 N* k1 s+ Zif(!String.prototype.leftB){
    5 {- m& E% ^, K/ WString.prototype.leftB = function(n){ //n=7( c9 r' r( Q; M; b5 p0 \4 @7 q
    var s = this, //s="ilove我自己"* s, j! a8 q2 Q. ~
    s2 = s.slice(0, n), //s2="ilove我自"% ]. Z! i- b0 I# Z
    i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9
    & G, K# ]% A$ y' }+ J" V. A+ Z6 lif (i <= n) { # n$ F+ o5 t# `$ h" g. J0 @$ n. a
    return s2; k
    & D0 X% t+ M. \3 I- R}
    $ h$ M  p+ i* y4 Mi -= s2.length;// i=9-7=2 , n =7,几个中文3 X5 J' }$ u1 i( i( K, ~. W
    switch (i) { 0 B& X- \! H7 [% V2 c
    case 0: return s2; //全是单字节
    % S0 z4 g$ [" \- {& Q4 w6 Z1 ucase n: return s.slice(0, n >> 1); //全是双字节,比如中文
    # G9 _1 p  s4 Y( z6 _. Jdefault: 8 a% U4 w/ N5 S: N4 F! Z3 Q
    var k = n - i, //k=7-2=5,几个英文字
    1 \9 a& e% J' l, |( o5 T  es3 = s.slice(k, n), //s.slice(5, 7) s3=我自") N5 ]" S: H) G3 P$ m/ s9 g; @8 p1 O
    j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数) r: b9 v+ J. e8 j1 }- Y
    return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!9 K: ?$ X( J2 U5 ~+ _/ t/ |2 |- D5 Y
    } 6 j7 H  ?' I, X) q" V! A# o
    } 7 P  m- x6 T3 B, v
    }) S/ v2 C! M. _/ |% E% U' l# j0 C
    -----------------------------------------------------------------------------------------------------------------
    " p/ Q4 e$ U) F. O/ e5 _, Svar stringify = function (obj) {# X7 b9 M' @0 x( Z* U- g6 a
        var t = typeof (obj);
    2 P2 {2 T( ^9 h; r, \    if (t != "object" || obj === null) {+ m  ^" y' [4 O1 s
            // simple data type
    : J! v$ f% S8 ]0 d        if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
    0 U: c9 N* U& @6 [5 P        return String(obj);9 _1 R5 q$ X! ^: u& \
        } else {8 z* ^' l  Y9 o* w! \% D  N
            // recurse array or object
    & x, J' @2 u& X        var n, v, json = [], arr = (obj && obj.constructor == Array);' [5 }  m1 u" B+ J
    8 A8 ~0 |& j4 r- u
            // fix.& p4 y* o# r. M+ V
            var self = stringify;
    , c* H: t/ D1 S: W0 _
      _4 b3 |9 R# k8 y( v0 Z        for (n in obj) {
    3 D% ~) p% [+ B8 _. q0 d4 T            v = obj[n];+ _/ P/ U3 c8 U
                t = typeof(v);) |. P# d: c8 C3 b; v) j
                if (obj.hasOwnProperty(n)) {& |' M7 ~. _8 A4 V
                    if (t == "string") {3 k4 x) [! M' h  D0 g7 R3 X
                        v = '"' + v + '"';
    7 |7 w' q$ H9 G# p( D                } else if (t == "object" && v !== null) {4 S3 `; \3 ~( p% ]- v
                        v = self(v);
    * H1 y/ |0 B( j0 _                }
    9 w" j2 F; t( _+ a# x5 ^/ [                json.push((arr ? "" : '"' + n + '":') + String(v));4 S4 y" l3 G2 m. N
                }
    + c; y+ L4 L2 q  S# M        }
    * }) @( }) f+ ]) w; h: Y' ~        return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
    ; q) N5 Z/ s& m- o, o3 }$ J; Q    }) p+ U6 O( I4 y5 [2 \
    };+ O* W% n2 u  {! t/ s& I0 R. n* E  O

    ( [: @7 \) l' e% }4 j/ e1 j- W. G
    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-16 12:15 , Processed in 1.032060 second(s), 51 queries .

    回顶部