QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)+ t4 b4 [5 }  ~. p) z
    算法:; K( r& |1 k9 q% h% z6 `, A9 @
       英文是单字节字符,中文是双字节字符,
    ; B# |) U0 N( X4 x, z8 E# i3 t9 _- H/ z   如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源
    / ^3 o8 T/ \' e  T
    + z* ?4 r8 o* e; X! ]4 w( A  G   假设n个字符里面,有 k个英文单字,i个中文双字) j& ~9 o7 c9 Y
       那么截取的时候只用考虑最右边的i个的字符0 Q3 N+ _: t) L- Q: g& n

    4 k! L- M/ O4 [# ]1 I* H   assume 左边都是英文单字的话,那右边的就全是中文;* G, j% j+ y! _) c" Z
       如果全是中文,那么有几个中文 就截取几个字符
    , h+ @/ q# l. R* \5 W/ G; E9 X& l1 F
    迭代的函数 输入应该是字符串,输出应该是左起的n个字符
    ! ~; u" i. _5 I$ C( C, o/ L迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)0 f4 I* Z4 Q/ K2 Y; h7 B6 M

    + \2 {& u0 b- q# G9 p+ p迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代3 S2 q+ q/ f; U9 S% r5 k, N. |# ^
    -------------------------------------------------------------------------------------------------------
    # F! P5 H8 ]  ?, Y- bif(!String.prototype.leftB){
    6 m; b+ U* D, d+ j1 {String.prototype.leftB = function(n){ //n=7
    + z3 s7 X% y6 Bvar s = this, //s="ilove我自己"
    2 t5 t9 c. I0 f6 B  n$ M* k7 k1 xs2 = s.slice(0, n), //s2="ilove我自"2 ^! o& h/ |% A+ I  D! I5 c
    i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9: V3 A. d5 A" c* T
    if (i <= n) { 8 e0 W. e1 z( p- Z2 Y! B
    return s2; k- h! Y  [7 ~! Z9 g! v
    }   F4 ~, e8 J, ~8 C/ Z, `9 r, z, L
    i -= s2.length;// i=9-7=2 , n =7,几个中文
    ) ?" B& J+ Q0 \6 E# ?switch (i) { % @7 ]& {; d9 J2 t! J* k) D
    case 0: return s2; //全是单字节- C2 }3 C* d, b6 E/ E1 C( @
    case n: return s.slice(0, n >> 1); //全是双字节,比如中文% w1 M8 M; f, Q# l& j+ Q9 g$ k
    default: 5 {, f0 u0 Z6 T: D5 L6 g3 m
    var k = n - i, //k=7-2=5,几个英文字
    " U+ J0 R! e4 M% vs3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
    * R( y1 g2 c; n9 a$ P7 B& Oj = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
    5 m$ H; R  l/ i  x6 ]7 Sreturn j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
    5 N7 }! o  _/ ^} # _* }4 s" w- a3 U
    } 6 i& D( C- M' v% }
    }
    ) V, ~4 L. e8 @; c  X" f1 h: Q-----------------------------------------------------------------------------------------------------------------* o( K* N: S+ o, {" Z. |( B6 k
    var stringify = function (obj) {
    - s9 c4 M2 Y- n8 R) M0 A( m9 @- e    var t = typeof (obj);/ R6 @* @4 a, Q- o6 z* R  w4 g
        if (t != "object" || obj === null) {
    5 F$ }. Y6 k! R  }6 s        // simple data type
    - a9 [0 L3 ^& z' {        if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
    2 f/ G; L8 [% F: O0 E- d        return String(obj);
    : O. z  j+ k. X3 c# L1 }    } else {6 M9 y8 R& {  k3 B
            // recurse array or object# ?/ m* |/ h$ F+ {! d
            var n, v, json = [], arr = (obj && obj.constructor == Array);
    # J  J, F4 y2 v7 }# }* S; k6 b& n% j: i3 ?, s- X0 m9 K# ~
            // fix.* a$ Z& a9 j: Z
            var self = stringify;. v- E' t- j" O& l' R8 j6 k

    # t6 B: W- D5 ~* _        for (n in obj) {
    . O5 E! J; ^& y- C  i! L2 L7 \8 C8 `            v = obj[n];
    * s' u. L* T- o8 B            t = typeof(v);
    8 I. f. h7 K% m$ f0 n            if (obj.hasOwnProperty(n)) {
    . J( k% ]6 W& E  Y                if (t == "string") {( ]6 r) y, u7 f/ @4 r
                        v = '"' + v + '"';
      k6 k+ E4 o3 G6 }/ m  o0 m                } else if (t == "object" && v !== null) {6 L" l1 D4 c# |7 b
                        v = self(v);
    ' g- E* `. N; I2 F& A2 W% M: s                }3 Q) _. K9 n; [2 p& r
                    json.push((arr ? "" : '"' + n + '":') + String(v));
    % q* ?5 w' l& z$ N( {            }
    ( f# l! X- d3 _$ f( A        }
    ; Q5 ^! I5 `  y. Q        return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");! j7 X) E9 S* K: O6 V/ B
        }
    7 v1 K; x6 D- y' _# n};# z0 P* E& s3 S; X3 w5 W: t2 n. w
    8 ~. j) i% b- x, q% Q2 l8 Y4 |/ N
    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-31 11:30 , Processed in 0.317764 second(s), 49 queries .

    回顶部