QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)
    - J- d: y2 |- U* k& f( W算法:
    9 H/ V0 Z5 |( R7 c+ R* F   英文是单字节字符,中文是双字节字符,, a" I) S; @9 z
       如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源
    2 D& f1 r+ o2 k8 h; g1 |: U- X: |' F$ _8 ~% ?) R7 L/ ~
       假设n个字符里面,有 k个英文单字,i个中文双字
    ) A( e! L+ E! V" p: d( |   那么截取的时候只用考虑最右边的i个的字符1 p5 I8 o" S" t3 W
    - k( F3 F& [) _* v+ R8 L' J
       assume 左边都是英文单字的话,那右边的就全是中文;
    9 K0 {6 O( ~, y  L0 N1 n1 [: m   如果全是中文,那么有几个中文 就截取几个字符5 p# Y, d" s5 L4 Y& d* Z

    / S0 r  d7 N; j% s" S# s! x迭代的函数 输入应该是字符串,输出应该是左起的n个字符+ b( H' U. ?$ J6 v# U0 V* {
    迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)
    2 G4 {+ U3 T) l9 J7 O
    , [& C$ y8 N- T+ E8 P迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
    - V  s! u' h9 @/ r- k-------------------------------------------------------------------------------------------------------
    & e3 k5 n' K+ u' l' o, J" Hif(!String.prototype.leftB){ % q3 C( p$ N% \' e3 V; F- m
    String.prototype.leftB = function(n){ //n=76 i" U* X- m6 B- a# n( i$ H
    var s = this, //s="ilove我自己"
    5 ?" k2 s/ Y( p* m; e% P( c, es2 = s.slice(0, n), //s2="ilove我自"
    9 s6 F5 T4 N* f" V/ R4 di = s2.replace(/[^\x00-\xff]/g, "**").length; //i=97 y: o! O# N. P) J5 ^
    if (i <= n) { : ?7 w+ {- v. D7 P1 _4 ^3 ^
    return s2; k# Y0 ^# m, O$ i( L
    } 4 D& X- \& [( U" m
    i -= s2.length;// i=9-7=2 , n =7,几个中文3 k4 c; S1 Q7 p9 R* ^5 L$ M
    switch (i) {
    4 {1 s, Z- Y; x2 U6 g; scase 0: return s2; //全是单字节0 |6 [" w8 }3 l' L; A: ^
    case n: return s.slice(0, n >> 1); //全是双字节,比如中文
      c1 a+ d* V: y& @* j4 _/ Mdefault: 7 H& e& P' {& d: k* v3 L
    var k = n - i, //k=7-2=5,几个英文字
      ^9 @# @7 r! A7 e( P& y: h7 es3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
    3 m; d& d- e& Rj = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数* m) }* |4 o% @  G
    return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!- }  q/ f( \; M9 W- Z1 T
    } , E+ Y, _8 s# T2 {# H. N$ B- F
    }
    2 j; x* l. k( o: Z$ s}
      U$ u* b$ |2 H$ R- J: J-----------------------------------------------------------------------------------------------------------------
    . ?- W2 q! w+ @, \: Kvar stringify = function (obj) {
    ! O' z8 f' M! b( j    var t = typeof (obj);2 k" w/ X. Q- D5 m; v
        if (t != "object" || obj === null) {$ r! E6 [+ x4 Z: E
            // simple data type, ?+ [! `8 `# V2 q5 [) L  }
            if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!7 [* j; b+ ]. h) G) W
            return String(obj);
    2 c! D, b) B& ~: v1 ~    } else {
    / T, E1 \% y, x9 P+ y5 s# B4 y        // recurse array or object$ n6 R/ M5 x  F1 h( {& f0 \$ @) u
            var n, v, json = [], arr = (obj && obj.constructor == Array);
    . K+ ^( f& b. V# R7 G% T; q$ i" K& t8 E# y& w0 ?8 s% ^% `6 y
            // fix.
    3 i2 w# C7 q+ ~! l        var self = stringify;
    3 a8 b6 s4 ]9 f; {; Z1 w6 O& l. Y7 m, d* s7 \) R0 T* n  e) {
            for (n in obj) {
    0 V7 l0 B# w! y( ^) V            v = obj[n];
    $ P) o/ k6 ~4 v* J9 e2 D- y            t = typeof(v);' D) v, G8 |& R9 r
                if (obj.hasOwnProperty(n)) {' b0 W1 z+ X  _2 f8 x% Q# G
                    if (t == "string") {
    ( p% ]4 e. E* f' t, N1 X4 I2 g                    v = '"' + v + '"';
    4 I& m7 |& ?" k" d                } else if (t == "object" && v !== null) {$ S/ o, D; T; n$ {% I
                        v = self(v);
    + r' V! ~  o) T4 L3 _9 X! [                }3 o: K6 A! ?' `- M" [
                    json.push((arr ? "" : '"' + n + '":') + String(v));# T1 ]1 U  N/ N4 J/ F; ?* e
                }
    , G# G9 t7 g9 Z* @0 b2 j        }9 ]% h2 k, L* [" B4 ?$ {
            return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
    3 T' h8 [3 C. E' ?' r1 e0 c    }
    , y% D, j, O# ]4 s};
    % Z$ z: V  g* h" a+ y9 _% d
    0 e* g& g( r* w- z8 @
    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-10-24 16:25 , Processed in 2.425664 second(s), 50 queries .

    回顶部