QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)
    4 e: _, E8 h& _, O4 ?) b算法:- Q* b( L/ u- }7 j0 _$ m, Z; ?4 d
       英文是单字节字符,中文是双字节字符,
    / c/ V" W/ C3 c( z   如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源
    1 d7 T* n6 @2 J4 w) t* u' F1 K! n# |  d; v; K
       假设n个字符里面,有 k个英文单字,i个中文双字9 [7 G" i# i% K  R
       那么截取的时候只用考虑最右边的i个的字符% T7 \" `% k$ M+ C

    2 @; f7 I8 l2 `+ i/ E0 {   assume 左边都是英文单字的话,那右边的就全是中文;
    - l/ A8 G+ p! C6 ~   如果全是中文,那么有几个中文 就截取几个字符, m5 E+ G/ f8 W+ e
    8 L4 R7 u, D- n$ K+ u/ `
    迭代的函数 输入应该是字符串,输出应该是左起的n个字符
    7 X8 u8 u8 U; x. m& I; P& b迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)/ \  q: b2 k& K/ z

    - _# r3 ?% D9 g7 ~. a. o迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代( L3 E, h! c+ Q
    -------------------------------------------------------------------------------------------------------
    2 U& @4 Q4 I# rif(!String.prototype.leftB){ # n  \  b( x; y% Y* c+ t
    String.prototype.leftB = function(n){ //n=7
    , a- L9 ]1 U, Z8 }8 ], w5 ]" gvar s = this, //s="ilove我自己"
    $ D  t* a" {$ ns2 = s.slice(0, n), //s2="ilove我自"2 H. i4 n& W1 b8 A. @6 a
    i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9
    ; O9 W5 g; Q* r' Q  S: I9 wif (i <= n) { & b) t! P* m$ l6 i8 _1 {
    return s2; k
    0 m( B7 _1 t- ~" P' g0 a} ; ~6 p) u/ t) H1 d: C# k" U% ~2 w
    i -= s2.length;// i=9-7=2 , n =7,几个中文- Q: o# b! V# d( m. q
    switch (i) { 8 V: K( I8 o- T- e
    case 0: return s2; //全是单字节* Z1 q1 w/ h. Z' P! {: I0 f2 k
    case n: return s.slice(0, n >> 1); //全是双字节,比如中文8 n4 ?& f4 a  X3 H' m8 r
    default:
    8 @* H0 z. Y6 g) Z  h. E; s2 hvar k = n - i, //k=7-2=5,几个英文字
    7 I2 c- J4 Y! Z, G' c( Xs3 = s.slice(k, n), //s.slice(5, 7) s3=我自"$ O* N) a( L+ s/ Z9 C
    j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
    4 o% ^, e# k# x. ~: R, \/ Rreturn j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
    # G+ W* Y2 I! P+ {}
    9 T% l  @" v4 ]2 }  y% u; T9 V}
    # J6 q- @+ i- X9 U# s3 S, M}
    ! ^9 ^4 K: {: ~3 T; q- G2 t# N-----------------------------------------------------------------------------------------------------------------7 J; Q# P; f/ [5 g0 E
    var stringify = function (obj) {
    7 g, m, {8 l- F. E$ X    var t = typeof (obj);
    0 x+ K! m) i) ]    if (t != "object" || obj === null) {) S1 F: e4 b( v% K% W
            // simple data type
    : c1 K' N4 q/ ]* V5 u+ e0 y        if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!& U2 M. n, }8 o
            return String(obj);; Q% I4 m' b5 s: _$ F& p3 l7 f0 e8 Q
        } else {- \# S8 d8 R- @9 R( P. ^: {
            // recurse array or object
    * A4 \2 A8 M9 s5 u  z/ b2 M        var n, v, json = [], arr = (obj && obj.constructor == Array);2 n% W! ^! ~  l- w
    " p/ O5 l) e1 p
            // fix.
    2 X$ V. M8 Q* u6 N9 z9 [        var self = stringify;
    ) s, f8 g, N" y! d/ k* u, t5 I3 S' H$ u( n6 [
            for (n in obj) {, n/ Y* E1 o5 b  p, }( A
                v = obj[n];7 j, X' k9 m, h( s( x. m1 H; N. R
                t = typeof(v);
    7 F2 ]. e1 G; a3 m' |            if (obj.hasOwnProperty(n)) {
    1 l9 ]7 T; T7 b                if (t == "string") {9 Q* q- i4 T# p! Z# O
                        v = '"' + v + '"'; ' |4 J* W( C+ U: o
                    } else if (t == "object" && v !== null) {
    / K+ h1 S6 X: h- V                    v = self(v);
    7 s. b5 i/ t- R                }
    7 D% a( H$ e8 @                json.push((arr ? "" : '"' + n + '":') + String(v));8 H" m3 U# j9 P; Z$ F
                }
    $ F& f" O* ^3 z3 Y% X        }& u9 _: M2 I0 R0 n+ P0 B& s
            return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");# |" Z: |& g; E& ]& p
        }% u+ B; q7 X- V) X
    };8 j* G( @+ O* r! C( K+ l
    4 S4 ^6 N0 a$ v  `4 [  N4 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-7-14 04:19 , Processed in 0.596064 second(s), 50 queries .

    回顶部