QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)% X- e/ I. z2 @. F! D9 M( {
    算法:1 w4 q3 L0 t# `. V2 s: t9 y1 x1 d
       英文是单字节字符,中文是双字节字符,# j7 C0 e  @" q
       如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源
    2 M# N/ O4 y. N# ?1 K, g* e/ F0 m) W  T7 z$ I7 w7 I/ f3 A* a
       假设n个字符里面,有 k个英文单字,i个中文双字9 p9 O4 ]9 ]+ E6 E3 d$ Y4 x
       那么截取的时候只用考虑最右边的i个的字符
    ) n! A/ Y9 s! f0 x7 O6 i0 A; i* D8 C3 k3 ?( [6 C6 E+ \
       assume 左边都是英文单字的话,那右边的就全是中文;
    / F2 H( T/ C! G* I   如果全是中文,那么有几个中文 就截取几个字符
    : S4 ^* w& o5 l" J4 c
    ( i5 ^4 n! R( n' S迭代的函数 输入应该是字符串,输出应该是左起的n个字符
    ) C0 O* ^# V* ?; V% i1 h迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)! x' D8 h, ]/ \' |( [" K9 B
    * j8 X0 @5 M4 s$ ^7 T7 w# s
    迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代7 G- t, N$ m7 W, Y* I6 V; |
    -------------------------------------------------------------------------------------------------------5 _8 M$ @' x3 F$ g* G. W+ o5 u
    if(!String.prototype.leftB){ , z3 ?  F* ~: w" Y' p' \1 d
    String.prototype.leftB = function(n){ //n=7$ x( O$ h# w/ T( x8 e
    var s = this, //s="ilove我自己"
    ) J) o' j' _0 b: A2 @s2 = s.slice(0, n), //s2="ilove我自"' J8 j: w0 S& m9 S$ O2 T( m+ S, h
    i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=99 t3 j% _6 d5 p2 @- b9 X+ @5 k
    if (i <= n) {
    " B6 a/ s# z" w6 E# Treturn s2; k  }" }( w, v0 w
    }
    8 f4 X4 i. x, t1 C3 V; \i -= s2.length;// i=9-7=2 , n =7,几个中文7 e7 ^9 v4 n8 h- [0 j- j
    switch (i) {
    ' c& |+ j/ t& q# N0 B, Ocase 0: return s2; //全是单字节
    7 L; k5 I; S" ~case n: return s.slice(0, n >> 1); //全是双字节,比如中文
    , e" Y. Q1 d# h% [default: # g' ~' T8 u* w3 W; X
    var k = n - i, //k=7-2=5,几个英文字
      u. I. r; s( I& o* bs3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
    1 }7 }" D0 u" Y) U, Qj = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
    " G: R0 h  |: h% D$ u1 U6 M0 dreturn j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
    ' n+ r  K: Q1 p* W3 @$ J( t} : X" E  c; h7 C, S2 [
    } 4 f+ B( ~. f) s; W
    }
    ! _* l. k, _+ g- e/ b9 S-----------------------------------------------------------------------------------------------------------------( R, c% ]  R; @2 N& C
    var stringify = function (obj) {
    7 s$ B' j8 u. Z) K; p: S5 N    var t = typeof (obj);
    ; y+ e% l& r3 r1 Z3 o! h5 r    if (t != "object" || obj === null) {
    / U# J2 x! I" p) r        // simple data type' z6 X) v  h! W; ^9 k9 }) S7 r
            if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
    - Q  b: f3 r1 a1 n* f/ _. U% ^        return String(obj);: T8 L* ?- g- R
        } else {1 W, x9 t  A# B' J/ S+ }9 K
            // recurse array or object
    " c4 Q+ S) b( Y( R% ^        var n, v, json = [], arr = (obj && obj.constructor == Array);: s. Q8 p  d9 j- ?+ {. p

    $ g/ z& ~- U* a: B7 }        // fix.! l3 w' N5 k4 L3 ~# I1 y
            var self = stringify;; r! S3 c. R( d/ O( w8 a8 \
    ! h  x6 ~) Q. v8 F. P
            for (n in obj) {% y8 r3 K: b8 q2 D3 o
                v = obj[n];
    " d0 o& h/ G' D  a7 q" d            t = typeof(v);
    ) N: |$ q9 |6 ]; L" Q            if (obj.hasOwnProperty(n)) {
    2 E" F! @4 N& Z                if (t == "string") {( ^  U) Z1 B2 I3 v1 H4 |; M
                        v = '"' + v + '"';
    & Y5 Z5 x" n6 U6 ~! H& s6 ^+ D3 y                } else if (t == "object" && v !== null) {
    # B# \* h5 P: A8 p$ J% z6 T                    v = self(v);9 U1 v) J* \: {: [
                    }! `  C. H; V5 ?7 l! a
                    json.push((arr ? "" : '"' + n + '":') + String(v));
    " L7 W$ `1 v$ ]/ f/ x            }
    . d( v5 Z" h6 A( f; G        }: X5 n% J- K, H1 T
            return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
    $ w3 o0 @8 K5 ?4 Z7 D1 l) I    }0 G* g$ ?8 h8 S- V8 \1 M
    };5 N. `8 M# B8 |% h  [' y

    ) T. u8 v( I7 g7 J
    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-14 20:46 , Processed in 0.382703 second(s), 50 queries .

    回顶部