QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)
    . d! ~. w6 I. o% O1 A1 I& A算法:
    6 a, `6 t8 v$ ^6 W0 k   英文是单字节字符,中文是双字节字符,7 p: S9 @: X! B
       如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源* X/ {( t1 T4 R2 ]! @* B0 V
    $ X$ X, X5 z. E' @- r
       假设n个字符里面,有 k个英文单字,i个中文双字
    ' v) |) C6 G4 J9 T# M  N; R  `# }& u   那么截取的时候只用考虑最右边的i个的字符9 v% C" K; m; c- d

    0 Y, t- u' z: ?% B9 x/ K   assume 左边都是英文单字的话,那右边的就全是中文;+ A: q+ i9 B  g& ^: R
       如果全是中文,那么有几个中文 就截取几个字符! X0 u2 y/ F" ^" {' I: P; c8 D

    : b9 j2 i  C: X3 a; c, z0 J1 X3 \迭代的函数 输入应该是字符串,输出应该是左起的n个字符
    2 g1 T5 s, l! U' ?  ^迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现), e- r- Z: U8 ]. I0 N/ |- ^# @

    & K2 Q: b9 U" E迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代! _9 G  r7 u; F# P( o
    -------------------------------------------------------------------------------------------------------
    , y. F% v" ]0 V  yif(!String.prototype.leftB){ 8 b+ h- x% H, L! ]1 P1 p
    String.prototype.leftB = function(n){ //n=7
    # d9 G/ |! N5 Z+ [% U. ^( pvar s = this, //s="ilove我自己": r3 O# B5 Q- w! y+ \8 t8 B2 @
    s2 = s.slice(0, n), //s2="ilove我自"" k" }- |& I  K: f) p2 o; i
    i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9$ L. w5 B2 P" x1 _; A! f' W0 m% C
    if (i <= n) { 1 {( k7 V' K& m8 m7 x
    return s2; k
    : H& K' s1 t$ ^. j}
    6 r2 q$ U6 f9 \; j4 k( Oi -= s2.length;// i=9-7=2 , n =7,几个中文
    8 r0 W1 @- }4 e0 |" c+ x# aswitch (i) { ) b0 n, N& M1 D& p
    case 0: return s2; //全是单字节6 \, F' Z6 Y8 X4 S8 _4 }& }
    case n: return s.slice(0, n >> 1); //全是双字节,比如中文6 b' Z8 E  v& U
    default:
    % H* _+ q- n  e! ?& [/ I; Nvar k = n - i, //k=7-2=5,几个英文字6 S& A* ~% W5 @
    s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
    # T8 u$ O. N' q. T+ S9 qj = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数5 x- Z+ c+ V0 V! X9 O
    return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
    & R" \) X4 F; q! E9 E' S} ) q" V/ T0 m6 }5 ?, U, c
    }
    1 l$ n, f8 y" v}
    $ X7 ]- s9 Z0 @% D, `/ A-----------------------------------------------------------------------------------------------------------------
    3 l8 |* R; f  w/ h8 Gvar stringify = function (obj) {
    + j& B, F* Q4 }6 m# y9 b8 V9 i) e    var t = typeof (obj);- Y" Y! t4 R+ M9 L
        if (t != "object" || obj === null) {. _  R6 N% k2 E$ w
            // simple data type. u( g; H' M5 m5 V9 p
            if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
    ! q3 i  i( n. `' p        return String(obj);
    3 L% q+ G& a+ G( V( l4 \1 Y% I    } else {* i9 m; s  u4 q( N# J9 m
            // recurse array or object5 b+ N% E9 d1 {& S. @8 m" K
            var n, v, json = [], arr = (obj && obj.constructor == Array);% d# [8 s2 I7 S8 K8 x2 `

    6 \0 ~- u( G" d! G% i1 g# f        // fix.
    5 d. p3 v: x" P$ v% K" b        var self = stringify;
    " A3 ]. \" @! e) N4 v0 y
    " L, U+ H, z1 |/ r: W        for (n in obj) {: M& O; {" q3 a0 T
                v = obj[n];
    ; R" \% n/ R+ a+ Q( f" X) z5 U            t = typeof(v);! W7 I1 i6 n! k9 X, v! `
                if (obj.hasOwnProperty(n)) {
      w$ w- p! H* R                if (t == "string") {
    ' m8 n0 Z, y  K6 t! a                    v = '"' + v + '"';
      X2 Z2 `# O& {  _; B, T, Z                } else if (t == "object" && v !== null) {1 C8 M( S$ N% d! p2 t
                        v = self(v);
    ' F9 e* M7 B/ l; ~) T9 c, M                }, t! R0 e/ D! s) {6 ^$ z0 c/ S
                    json.push((arr ? "" : '"' + n + '":') + String(v));0 P, a6 K9 d/ H9 R
                }
    ; E( b7 i# K  ~* I' c5 ~" f, [        }
    ' C  V! n! e& {: g+ i- Q/ v& z8 a        return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");+ [+ p4 q* @. H9 Z% ]
        }
    % O6 m( o, K+ \+ W" f& O$ p};' ~7 V+ T2 \) `# u4 n

    : `- W, a/ Q' v( c( N  }. g5 z6 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 16:39 , Processed in 0.417747 second(s), 50 queries .

    回顶部