QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)5 G) C% B: I( J" Y# D- b+ `! c* c! N
    算法:4 q$ |/ I& n+ e1 s. {5 |( r
       英文是单字节字符,中文是双字节字符,
    5 Y9 W8 j/ R. w   如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源3 g/ Y( [1 r) N& P: W  C4 ~
    1 d' T2 b8 d2 S5 Q: S. j
       假设n个字符里面,有 k个英文单字,i个中文双字9 K9 M) i9 J( C
       那么截取的时候只用考虑最右边的i个的字符
    ; e" |' ^+ h" m  z! ]/ X9 H+ r; g7 y; S/ p: h
       assume 左边都是英文单字的话,那右边的就全是中文;7 ?, N( e; D, u9 c, F  X1 `
       如果全是中文,那么有几个中文 就截取几个字符
    8 @5 T$ k8 W" u% L/ ^" [; M6 ?- {# d+ N. {* t$ [
    迭代的函数 输入应该是字符串,输出应该是左起的n个字符7 a# Q6 F, u6 y6 N& \1 Y2 B0 ^1 c5 y% K* g4 Z
    迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)
    & Z& o( X; u# e! z
    + s% Q" B0 q9 ?- x4 l6 u+ z迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
    4 g. u7 P- w6 m% c& u( s, C! [+ ]6 z-------------------------------------------------------------------------------------------------------
    # Y* w3 O" I* w: j0 _1 Zif(!String.prototype.leftB){ $ C5 m; E! @2 h/ {
    String.prototype.leftB = function(n){ //n=7
    2 e  ]2 D- z6 B* N; Gvar s = this, //s="ilove我自己"3 c9 o* o1 I0 G; E) m9 ]' N) m; ^7 k
    s2 = s.slice(0, n), //s2="ilove我自"
    ' V! s! o) p, ~, W5 xi = s2.replace(/[^\x00-\xff]/g, "**").length; //i=91 v) p* X9 F  k7 z- E6 L: a
    if (i <= n) { + u4 W* S4 \. p( _9 U/ ~: u
    return s2; k
    # E1 `' @. b- X2 v7 [; A9 j3 b} ) @* u3 L( [& c( _$ s7 K# J3 W
    i -= s2.length;// i=9-7=2 , n =7,几个中文
    2 S# t0 f+ w3 x9 G+ nswitch (i) { , {' h) E! s/ d( Q
    case 0: return s2; //全是单字节
    ; F5 `% N5 |+ A: W2 ?( z2 Zcase n: return s.slice(0, n >> 1); //全是双字节,比如中文
    5 `8 h( `8 _0 @/ Ydefault: 3 J' {6 i' p# h( G* ^% R
    var k = n - i, //k=7-2=5,几个英文字
    5 y! f- O- @. z5 a& ~- m6 ds3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
    4 e  Z( ~: B/ \j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数/ m1 ?$ Y% A5 s; S5 Y) q
    return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!# W$ Z$ m0 r% S% p' k1 {
    }
    ; L$ w3 m9 V' e8 r) C0 ^& J7 D7 q" [}
    $ Z4 |4 B/ t7 h7 l8 @' M}! j8 [" K7 @+ d* J
    -----------------------------------------------------------------------------------------------------------------
    & [# U, u1 y- x; D% bvar stringify = function (obj) {/ N) x! W  J% v9 r: l
        var t = typeof (obj);4 b- b5 J# y, H) e4 Z! X  M% b+ p
        if (t != "object" || obj === null) {) e( f7 J- M" t; v5 Z6 a
            // simple data type
    $ q4 W& d1 D2 l        if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
    # w$ C% ^' N. `4 {& S        return String(obj);
    / C+ y' T8 F+ o5 D+ m    } else {
    ; m5 }( H: }% S( k6 i, n        // recurse array or object6 u/ `4 r2 T( {0 B+ A2 g
            var n, v, json = [], arr = (obj && obj.constructor == Array);
    : R2 N6 V  e; a5 A  l1 {) B& R% K( L  o; R" b
            // fix.& L7 b. E4 f6 M" }6 }
            var self = stringify;
    - o7 Z  c$ Z% J" ]6 o  T5 s, \
    2 T4 v0 j- v* W        for (n in obj) {1 L6 t* F. P6 U% @& L& M( V+ a
                v = obj[n];4 F5 r' a' d" \  v7 z6 }5 T
                t = typeof(v);5 o6 N' ]$ X& T4 {
                if (obj.hasOwnProperty(n)) {
    # J- T4 ]" [& Q# p  [& `- s2 e( _" G                if (t == "string") {4 j/ {) i- Z; I' M, @) e! D7 v7 w7 M
                        v = '"' + v + '"'; 5 _9 P5 S  d, ?1 o. d+ Q
                    } else if (t == "object" && v !== null) {2 i. n. p& }7 p! M: ^
                        v = self(v);& O: H7 c! l" S/ |" s: Z. T3 m6 N
                    }: }8 f: L: E# [# S5 _
                    json.push((arr ? "" : '"' + n + '":') + String(v));+ o4 x5 _% |0 M4 s
                }+ a9 N9 K2 B$ {% d
            }1 O; C6 b3 d9 `
            return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
    8 Q- v. Y+ J( E" E4 m" [    }
    1 n. g- W( C! l2 C3 ^};$ V+ \0 U" j* O) l& q6 m

    6 ^: L0 J1 K2 x4 v/ `+ q2 @& D' O
    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-11 03:07 , Processed in 0.431053 second(s), 49 queries .

    回顶部