QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |正序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)
    4 {+ }. x7 z- H5 W% R/ m$ j算法:: x& s" v6 v. e4 v! R) I
       英文是单字节字符,中文是双字节字符,
      c& |4 L: R3 b7 [2 c0 q8 z, A   如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源
    & J) t7 ^3 r3 [& Z' E. a) o  v; ^# p+ k. a; F3 t
       假设n个字符里面,有 k个英文单字,i个中文双字
    - g7 U6 c3 x# M8 m7 {   那么截取的时候只用考虑最右边的i个的字符
    ! r/ K3 `9 I, l8 d9 R2 W& k+ _6 {% M: E* ~2 e
       assume 左边都是英文单字的话,那右边的就全是中文;
    4 u& K/ \+ F% K- M# g1 K   如果全是中文,那么有几个中文 就截取几个字符
    0 m5 F# h) w& q: {2 X. v, ~3 g+ i
    / T) A- I. P) c( `迭代的函数 输入应该是字符串,输出应该是左起的n个字符9 B" V. e( `0 t6 M& V
    迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)
    " R% y$ b4 O: r3 s$ M' w
    " ^* v0 f8 |$ E- }* P$ _4 W  c* y0 E迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
    : w' Y8 n$ _. ~! D+ @2 \6 Z6 S-------------------------------------------------------------------------------------------------------% Z8 o2 {: C  R- O& _5 @
    if(!String.prototype.leftB){ 9 q# ^! A9 N" O; J) D* ]* L
    String.prototype.leftB = function(n){ //n=7
    * b2 U* g" t' J3 u- f4 s* xvar s = this, //s="ilove我自己"
    ) p0 }" V9 }/ ~5 fs2 = s.slice(0, n), //s2="ilove我自"6 x; b, O0 U1 y0 @& x# Q
    i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9. ^- w& }. ?) h$ h. u# g, Z# V
    if (i <= n) {
    5 _! _9 o( k3 treturn s2; k
    4 t+ x8 |) b$ [0 F. `5 c8 P+ s* }}
    1 U" q) |- \* `5 Z" [& _' Ei -= s2.length;// i=9-7=2 , n =7,几个中文
    2 G. n8 G, }  w+ eswitch (i) {
    ! B+ Z7 i' p$ P) Wcase 0: return s2; //全是单字节: V% W# g! [# H: H; U5 x4 }
    case n: return s.slice(0, n >> 1); //全是双字节,比如中文
    0 f) ^+ c' G' x! |3 Y) N4 j  Ndefault:   Y/ N- E# p: T5 }3 j# z$ u
    var k = n - i, //k=7-2=5,几个英文字
    # A2 @& x! b6 O( Q5 I. ?s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
    ' P$ _; }0 i9 J: C% Z8 kj = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数# c3 y! h0 i5 z
    return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
    ' g4 m7 t/ k+ I3 b3 N/ B4 t8 j} 7 P" G) J4 b+ |2 W) K7 ]: H
    } 1 y) X( C6 ^0 ?0 c, b% m2 Z: ~
    }. C- ^9 A" T  Y/ C* F0 g* {
    -----------------------------------------------------------------------------------------------------------------
    $ O2 v* Q" x5 O- R# I8 cvar stringify = function (obj) {$ R8 f; H9 s4 r- w
        var t = typeof (obj);
    7 I* d; Q/ a6 d& e- B( O    if (t != "object" || obj === null) {
    & s9 O  T3 K3 C2 e, h- U5 U8 K* T8 U9 z        // simple data type# n' U$ B- Y; {6 x1 k7 ?( H' O
            if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!0 m$ a: |! s- {+ B6 a" {2 Z) Z
            return String(obj);
      V2 ~: q& K3 F: z0 t, [4 u$ p& R    } else {) q8 }+ F" [' p& j
            // recurse array or object, F( N  }1 r0 X3 f  _9 B
            var n, v, json = [], arr = (obj && obj.constructor == Array);
    ! I& D4 T1 ^0 }- Y* W
    . P6 [$ l1 F9 c  P3 w( V5 h        // fix.3 ]# C0 v& j% B3 {7 q1 w
            var self = stringify;6 l  i% w- K0 l' W- A! F
    7 D" u/ J/ t' ]1 s) [
            for (n in obj) {0 m. |3 N* G- ~" j1 K% u& t
                v = obj[n];3 t& c9 O3 C, `* o2 s: d7 K7 y
                t = typeof(v);' I& `5 D/ ?9 a# E
                if (obj.hasOwnProperty(n)) {
    % [, W9 ~0 ?1 o9 V. r, {' Q( J* D                if (t == "string") {2 H7 Y" v( B' _1 y% I
                        v = '"' + v + '"';
    ' |) b8 B$ q: |& |* ^, ?# U$ _                } else if (t == "object" && v !== null) {- T/ H8 c% B8 ~/ ]2 `9 t
                        v = self(v);$ h" N' v. i, j( \. R7 l0 P
                    }
    " Q- B/ m$ M( E# \3 m6 q+ j                json.push((arr ? "" : '"' + n + '":') + String(v));
    . w% [& Y# W, p# T0 w; b            }
    1 m/ a5 `# F. E% s3 ]" t: L        }
    4 k, v# ?0 Q) q0 k        return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");/ X/ c1 r* E4 G
        }
    2 U! t; A5 ?- c* @- E};
    6 H% P# l7 J3 q2 {) f: k- @- a! \4 ]
    " M3 D+ f% K) G* D3 @: X; f! 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-7-31 07:57 , Processed in 0.468206 second(s), 50 queries .

    回顶部