QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)/ g% q* @$ r) u6 D# }/ R8 [
    算法:
    ( N* p: H; k/ N5 T" a1 W" Z   英文是单字节字符,中文是双字节字符,. \9 s' K/ F0 w0 K1 j: i
       如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源
    * E5 X& q6 k4 }6 n
    * t; {4 d! g2 G% [9 {! c' @   假设n个字符里面,有 k个英文单字,i个中文双字! D. G1 Q3 _* J, {
       那么截取的时候只用考虑最右边的i个的字符
    . I+ |8 X* e( W# j3 A3 |1 i
    * }  C+ @& w4 P   assume 左边都是英文单字的话,那右边的就全是中文;5 @" t) _  m: |1 r* ~" J! @4 U
       如果全是中文,那么有几个中文 就截取几个字符' a0 ^) k( q) @* R. k9 c+ y
    ; a+ r( v8 L: ^3 Z0 U) ?3 g4 V
    迭代的函数 输入应该是字符串,输出应该是左起的n个字符
    5 b7 \- c, ]/ s9 Z7 z迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)
    ! W, U& Q* e: U2 l
    ) j7 H# W( z6 ], v迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代/ x" k- P, q. C6 ~
    -------------------------------------------------------------------------------------------------------
    $ \( F- Y8 t6 J* Q- o) }: Hif(!String.prototype.leftB){ 1 s, P" |# ~1 f, U" ]; `, T
    String.prototype.leftB = function(n){ //n=70 C9 t% \; }! |4 W8 O9 }
    var s = this, //s="ilove我自己"* v- q# ~+ X, I3 @  W1 X
    s2 = s.slice(0, n), //s2="ilove我自"
    : z8 f/ [0 x, h& Ri = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9
    3 O8 @4 O! C9 ]# H6 Vif (i <= n) {
    ) Q! ?0 v$ R. c. E& [+ Xreturn s2; k
    1 I* R* [0 m/ |5 B0 c) e} ) O( E- x# z) k4 {5 A7 k- w- I
    i -= s2.length;// i=9-7=2 , n =7,几个中文
    9 a  e7 s/ [2 @& U0 s5 R* R' U3 Uswitch (i) { % z/ B) w* }9 K& `+ I+ z
    case 0: return s2; //全是单字节7 O5 `3 r: C6 u, X1 e2 z
    case n: return s.slice(0, n >> 1); //全是双字节,比如中文7 G/ _1 T( p7 {
    default:
    & C' k5 u7 l+ r9 A/ J! s. {% {# o5 [var k = n - i, //k=7-2=5,几个英文字$ z7 p8 d9 [; B6 ]
    s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"  c/ V/ W' Y' f
    j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数; ]7 J) R+ t2 E" e
    return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
    / ^! k) w* ~8 V  C" ~/ }' i5 K3 i/ k}
    2 }' E8 ]$ Z: k  B- {, H} ( T$ n/ K. G' _/ c
    }% Q- J" H( l$ O6 M$ A. I
    -----------------------------------------------------------------------------------------------------------------
    6 w% `' D4 b- Tvar stringify = function (obj) {: c# H! H( r/ D: |! Q* B  Q
        var t = typeof (obj);% J. Q( J  j/ i; y- y8 a
        if (t != "object" || obj === null) {5 @2 |8 h% T1 c' P
            // simple data type: V. W% e5 Z- N
            if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!+ g/ b) d: H8 B$ ^8 B/ v
            return String(obj);
    1 u6 l0 l" p) W8 [" C* k    } else {
    , _: X. s8 q( m$ p3 ^, T        // recurse array or object
    ! D7 p3 |3 Z! y/ c1 V) i, Y$ r        var n, v, json = [], arr = (obj && obj.constructor == Array);4 M4 I9 E- u1 [. m

    6 s$ G0 w% x( p5 d0 Q- V+ S. H5 P6 r        // fix.
    0 A3 g1 Q9 E1 J1 A" c/ L        var self = stringify;
    1 {$ u9 a* J+ @: [( O" L
    ' M- K  Z+ j$ ?' G        for (n in obj) {1 e  ~9 N) h; k0 X$ s! O
                v = obj[n];( X. U5 O0 O+ x2 O3 {5 T
                t = typeof(v);
      i: z: }! z/ Z" B. ?            if (obj.hasOwnProperty(n)) {
    * i8 r3 ]1 H2 [6 w) B) d/ a6 m                if (t == "string") {
    / H7 l) T9 @. T/ [" i! ?0 R7 J, m2 F                    v = '"' + v + '"'; # ?1 ?6 j% T! G" X& x2 d
                    } else if (t == "object" && v !== null) {0 {7 p* {3 r3 u, c
                        v = self(v);
    ) q' ~3 `. `& k                }: @% q) j9 O& N/ L7 V
                    json.push((arr ? "" : '"' + n + '":') + String(v));
    $ |' b. \; {4 D# ?( x% t            }5 `5 a- Y) K; u: I& `( a( r
            }
    ' W4 _3 [4 p3 y        return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
    7 C* p! r5 L7 g6 e' Q    }
    % H. j5 H/ G; g};
    * Y% S6 @4 k, Y# U2 @! W. ?5 f2 c+ c# S6 Y! B
    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-31 07:02 , Processed in 0.402157 second(s), 50 queries .

    回顶部