QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)& e7 ~5 V/ F. d
    算法:7 ?) x5 G9 y6 O$ `) K; [/ i6 I
       英文是单字节字符,中文是双字节字符,# i! r- w8 v+ u& l4 |
       如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源
    - P! ~' ~+ B7 O9 @  j, |, Z+ ]0 }4 ?# }
       假设n个字符里面,有 k个英文单字,i个中文双字0 [  }5 _5 N) N
       那么截取的时候只用考虑最右边的i个的字符, L5 N0 X4 k! Z8 X+ m

    ' p5 ]3 e2 T8 g4 A$ c8 H. f3 P   assume 左边都是英文单字的话,那右边的就全是中文;
    ) @$ U. i  g. V- @9 `7 i" f   如果全是中文,那么有几个中文 就截取几个字符
    # i5 U# O4 R0 d1 N5 W5 ^! _/ j: J7 |) J2 }) o
    迭代的函数 输入应该是字符串,输出应该是左起的n个字符
    / L: ^( x! r3 j迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现): }  Z& _, R- k3 x
    3 B7 @0 v4 E( x9 _
    迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代( I* [' n( O7 x! {. `& C
    -------------------------------------------------------------------------------------------------------$ |2 e2 c% N# z" y+ k8 y3 Z
    if(!String.prototype.leftB){ 5 Z% d/ n1 x: q" `
    String.prototype.leftB = function(n){ //n=75 W' q6 \- z/ _  q3 R  T9 M( C4 E# V, G! A
    var s = this, //s="ilove我自己"
    $ w: L: r  K% y- j$ m* d$ ]+ Hs2 = s.slice(0, n), //s2="ilove我自"# U) |' n2 x+ w. f- O" h+ O6 ?
    i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=94 z8 o" R% l+ r3 _) I$ p$ e' B
    if (i <= n) { , |9 L. K* U! |* f% q8 e: W9 n
    return s2; k
    1 ?1 Q7 ~! h4 m/ }; T$ b6 G}
    - x. ~- f# t( ^  \, G, V: Di -= s2.length;// i=9-7=2 , n =7,几个中文
    ! \/ I( F7 m- s( j0 \switch (i) { : ?  k# I) K- h( b% N7 h
    case 0: return s2; //全是单字节
    ) t  J# n, Y% R' Zcase n: return s.slice(0, n >> 1); //全是双字节,比如中文
    . o- H  U% P6 r% V: `& h; u) edefault:
    7 x  y; r6 N% e, d- wvar k = n - i, //k=7-2=5,几个英文字
    7 J3 K" B# N% q( a, W& d  P7 Os3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
    0 j7 \2 n+ I. D; e* fj = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数( `7 h9 w$ z" g; Z4 l
    return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!2 H  ?9 F1 E0 h- v) c; s- j
    } 7 D* E! }6 M/ P; b$ S; p5 k
    } ) M, W* u' a# W& s( t* w
    }1 V0 ~9 H. {9 R" Z+ _6 F4 D% _. N
    -----------------------------------------------------------------------------------------------------------------
    $ i) ~; }. f- C* K# e8 `: m2 P+ k+ z$ kvar stringify = function (obj) {( H0 @# X9 O" N* q
        var t = typeof (obj);
    " Z& t5 A1 d, S) U  {    if (t != "object" || obj === null) {
    & W6 B- S2 c) {* i7 F6 o        // simple data type
    ' d' C  k% e9 M        if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
    9 [9 ?' _" |, }- Y+ H8 S: V        return String(obj);. b: ]+ r% x$ G) s
        } else {3 m! t0 [" w5 {* w( C2 r
            // recurse array or object1 x2 L. l  Q; W9 i) T
            var n, v, json = [], arr = (obj && obj.constructor == Array);
    & N+ g- C- n8 U" I2 H) p# n
    & `5 d4 B( Z$ N        // fix.
    ' [% ]/ n7 N. y        var self = stringify;" i, w! r" [8 D; m* e

    0 P2 E0 P+ L) {5 x" r) P5 h( t" k+ k        for (n in obj) {9 {# k' `# E" F
                v = obj[n];) A2 m$ w( K; C! W# H+ z
                t = typeof(v);3 h- {# X! R6 v' E3 Z' j& g
                if (obj.hasOwnProperty(n)) {( D" N) Q6 z  q$ z
                    if (t == "string") {
    $ i; n# o7 y. y+ u                    v = '"' + v + '"'; 8 L/ s( c- L4 G8 B9 r( f
                    } else if (t == "object" && v !== null) {$ o) z1 J6 S& A  t; |  Y
                        v = self(v);
    # ~1 l) W* @7 }1 T: \/ |) H% J$ `                }/ e% G  n( l* {& v/ `: k
                    json.push((arr ? "" : '"' + n + '":') + String(v));
    7 o/ e1 e" `) K5 i8 `            }3 e& z+ K+ y$ a4 k8 e9 X8 t
            }- _& S7 q* n. O
            return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");* H# \# o: ?! M4 l$ M. ]
        }
      p9 X8 u# i+ i$ S  B& [* }; G};
    8 E" {- H/ h* i
    5 Y# d0 d8 k6 g) x! n+ p; e
    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-10 21:40 , Processed in 1.229759 second(s), 50 queries .

    回顶部