QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |正序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)7 u+ o  O$ T$ r% D+ z6 E5 }+ a  ^8 d
    算法:
    $ g+ d" v! j+ Q( ?# L$ k' u0 ^   英文是单字节字符,中文是双字节字符,( ]% H1 X- }0 @0 ?$ V
       如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源7 ~/ F3 H- _$ _' w, J- Y. T: Y

    ( c3 Y8 J2 F% p% F- W7 s: f: N   假设n个字符里面,有 k个英文单字,i个中文双字
    $ k+ \6 i( Y. E, x6 \   那么截取的时候只用考虑最右边的i个的字符
    ( H  |( {; C+ s3 `/ c% }# G7 D" K" U9 D$ F
       assume 左边都是英文单字的话,那右边的就全是中文;* Q, E9 p4 X2 R' n% Y
       如果全是中文,那么有几个中文 就截取几个字符
    2 V  t  e/ a. m
    / {9 V2 }9 v5 Q- {  |& G, Y! C迭代的函数 输入应该是字符串,输出应该是左起的n个字符( Q/ |. w4 v# ^: N, v- D4 t
    迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)7 k! I& s! L% l- d1 V$ V0 J
    1 C# [% e. q" A. `: R: f# K/ ~* j
    迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
    , h' {1 m' j; [-------------------------------------------------------------------------------------------------------! Y3 q; w. `$ }& K  a  O
    if(!String.prototype.leftB){ 5 v/ R4 r8 v; }1 I3 X4 u* Q
    String.prototype.leftB = function(n){ //n=7
    7 x7 A7 I2 o2 o8 b* R+ |1 q# ^var s = this, //s="ilove我自己"
    4 ^, j3 _" x, d, A4 y# ~! V/ ~  Ms2 = s.slice(0, n), //s2="ilove我自"
    5 h. y4 t6 Q6 N% u8 li = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9* |& c1 f6 t; Z; Q; H) T# b
    if (i <= n) { . z( D/ F! \5 G, d- f* T  W
    return s2; k
    1 u6 u7 e( L5 D5 [0 p6 k5 [, t9 z+ N+ U} 5 M6 }* m. ^  s" ?8 v0 Q
    i -= s2.length;// i=9-7=2 , n =7,几个中文3 f3 Y: o( b" n5 E
    switch (i) { / z  d$ w" \1 i' l' G
    case 0: return s2; //全是单字节
    5 P# m2 r" u7 j) i) w' bcase n: return s.slice(0, n >> 1); //全是双字节,比如中文
    " D5 Q1 Y8 B- d7 B4 S! gdefault: 2 I" I7 J, g- K0 n8 _; f, S" q
    var k = n - i, //k=7-2=5,几个英文字
    , \3 J5 n- H8 d' ~s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
    0 V6 G9 s7 u: e( I& Jj = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
    # O8 q2 X5 e+ k$ i+ {" oreturn j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!6 C# {' N1 X7 R- e' V  C
    }
    $ t, _. f7 M! y5 O' |) L6 b4 J}
    ! k; \+ l! D; D8 L! |}. n, Y/ B& H' P- a9 t1 Q
    -----------------------------------------------------------------------------------------------------------------. Z/ p" Y) L0 d* [* m
    var stringify = function (obj) {: E$ _0 m; h5 y# H
        var t = typeof (obj);$ T' k% ^' t9 R; R2 ~; c( T
        if (t != "object" || obj === null) {
    ' w2 t# y, t4 q3 B. N' d# y- ~3 t2 w        // simple data type
    - R6 N7 ], Y+ g  \4 y, T        if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!% n2 w# _2 A& ?4 ]' ^5 S
            return String(obj);
    $ s# w) W0 x5 V9 @; u* k    } else {2 v9 M+ X% _; l9 i- X
            // recurse array or object
    0 G% v: }( R6 }# [6 x        var n, v, json = [], arr = (obj && obj.constructor == Array);9 l1 |) B8 n. L5 Z/ c$ E) w5 ]

    & u2 Y2 Y) C1 G" m/ Y: E# l* q3 Y        // fix.
    # X+ k: t! L: _: g# L9 D: c        var self = stringify;* A8 Q& R9 j' K" j
    * P( i: \- |$ {& k( J4 v; `* p
            for (n in obj) {5 _. c4 j( {5 `5 O. w4 R
                v = obj[n];! O- M: C; c0 ?/ R
                t = typeof(v);: H6 z3 h4 \! B  b5 u2 I" l
                if (obj.hasOwnProperty(n)) {
    1 c2 F# J; N0 k. X7 r+ E6 u                if (t == "string") {
    0 _7 g: n9 ]! N( v# s5 g; e                    v = '"' + v + '"'; " C! h* E0 I8 {1 G# |* ^1 x
                    } else if (t == "object" && v !== null) {) C/ o( p0 M# i! |) C- A
                        v = self(v);, Y2 q1 Q: {) i$ o/ ?; n7 K- ^
                    }
    3 J9 V! q5 n: D" U$ C5 X- n                json.push((arr ? "" : '"' + n + '":') + String(v));
    8 V" R; M  f2 W/ n% p) l            }
    0 d# F! K( D. A2 L* w        }
    , F6 w& Q9 A7 e        return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");$ D% j" i6 p' z; b) U+ I% S! w
        }: n4 c% R! o2 ~! y3 ?7 C4 Y
    };5 T+ C5 n0 I4 N4 k8 D! ^
    $ x1 K6 h7 e* ~" `- ?% [  w; C
    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-8-1 02:15 , Processed in 0.825794 second(s), 50 queries .

    回顶部