QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |正序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)9 ?& T' ^- W2 i7 v% ?" }9 ?0 J! R" M
    算法:
    / d  a# e6 F% ]2 A   英文是单字节字符,中文是双字节字符,$ e! ?4 a! J& B! H; Z/ O1 W1 O* w
       如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源
    + b1 Q; P/ V2 H+ B5 W
    3 `7 S1 a+ g5 D, I# d; c   假设n个字符里面,有 k个英文单字,i个中文双字* _' ?$ [2 i8 m! W' g7 H
       那么截取的时候只用考虑最右边的i个的字符
    5 {, c- Z0 v( ]/ S4 j$ U
    7 e& m% R1 }& r6 [/ C* ~6 p   assume 左边都是英文单字的话,那右边的就全是中文;7 V% k8 E( g. }$ }- j
       如果全是中文,那么有几个中文 就截取几个字符% ?2 B; D! g/ U% a, H

    " d) H2 g: Z9 T( a& U) }迭代的函数 输入应该是字符串,输出应该是左起的n个字符
    2 F  S8 H/ Z/ c) E1 q- o迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现). \- r" e0 X) I( D/ \. I8 i
    ( I7 W$ Q6 [% G
    迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
    ; p# @* l& _' Y: {; F-------------------------------------------------------------------------------------------------------
    4 O6 v8 C# E# N$ Iif(!String.prototype.leftB){
    ) Y( a0 W0 M+ i% @+ a9 L- DString.prototype.leftB = function(n){ //n=77 |2 t% F; k; |0 D" A/ p  }
    var s = this, //s="ilove我自己"+ u% ~; g: N5 @8 S' }
    s2 = s.slice(0, n), //s2="ilove我自"
    6 Q" [( y' W2 J1 q( \6 Vi = s2.replace(/[^\x00-\xff]/g, "**").length; //i=92 W& w2 d" M( @* Y* T
    if (i <= n) { % ^# @& X- ]5 _6 O$ ]
    return s2; k
    ! k  [1 s' H' J2 |/ [5 u- S} # W* {8 W% u/ P( y) ]" `
    i -= s2.length;// i=9-7=2 , n =7,几个中文# `- D2 i0 G2 O( B8 C& p6 w
    switch (i) {
    + `+ }' w2 J, K  \case 0: return s2; //全是单字节6 R3 K1 \5 {. b$ a' i! x
    case n: return s.slice(0, n >> 1); //全是双字节,比如中文
    - L& j4 b, e4 \- L3 a+ Ldefault: & s! l4 V$ c2 [/ s. S1 X- y8 P
    var k = n - i, //k=7-2=5,几个英文字& w. q. ^, P( r8 l# M& O  u, @
    s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"; i& L1 r) D2 c& \( _7 Y7 k
    j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数) {8 j/ U) W( D, r) x
    return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
    . t- k1 H) Y0 f! p2 B; y! w8 [}
    . C: t5 ?% L2 J" T+ t( q}
    ' X5 n1 G9 ]; r4 s9 O7 N3 x- W8 s}
    9 s1 x; b4 c: l: i% O) P" y$ O-----------------------------------------------------------------------------------------------------------------4 s  f# U% K6 @# A; |
    var stringify = function (obj) {
    $ G# [5 m2 r& p8 `2 Q    var t = typeof (obj);
    % G" T8 i4 Q6 I% j8 f0 R$ w    if (t != "object" || obj === null) {
    - y6 w9 X) |1 g, X# z. a        // simple data type2 q; X- c4 B" C! L
            if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
    & O4 L; g* U& |2 u/ _( x. l4 u        return String(obj);
    ; r% _  i9 i8 `# A  l+ f    } else {. _% }; ^' ]; _* G* n
            // recurse array or object" H# N. v( f& \" U" @
            var n, v, json = [], arr = (obj && obj.constructor == Array);
    : ^+ h% o: T2 A) X& [- h, i! U% r* r( ]- ~
            // fix.
    ( G# B1 y, h+ o! i! T        var self = stringify;
    ' V# I" {/ q' S1 m" f/ s. n( V
    + _( P  X" G! k) e  k5 z        for (n in obj) {0 h8 j) U9 @% m: B* \2 {! o0 T7 x
                v = obj[n];
    " i8 A1 u0 Y+ N9 p: Z) h            t = typeof(v);
      D2 B8 }: K4 G            if (obj.hasOwnProperty(n)) {) F: E1 N$ ]& H4 s
                    if (t == "string") {
    $ L/ W) J+ _  _0 i- T                    v = '"' + v + '"'; 9 I: ?) e7 m6 R& N# N
                    } else if (t == "object" && v !== null) {5 {' O9 s) {3 q# h4 g( ~. }# q
                        v = self(v);( R5 w+ g) o2 e* x& M) s& X
                    }' u! g6 }$ W9 H$ F
                    json.push((arr ? "" : '"' + n + '":') + String(v));3 o: n1 Y1 g0 B4 ~
                }7 T: z$ s( y* t+ H
            }- F  b# R9 ~1 Q3 u
            return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
    ) J6 t, v( ~: i: S1 J    }
    : m2 O: p% G% d5 k9 c& I4 \};6 ~6 X5 a( N  q% \
    5 F+ e/ M. s  D# I7 Z3 ^
    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-8-4 16:40 , Processed in 2.132486 second(s), 50 queries .

    回顶部