QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)
    % S: P$ q% ~" h+ K7 Y算法:
    $ a. N- M' ~9 [  {   英文是单字节字符,中文是双字节字符,; i. `" z1 J" }9 G
       如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源& r6 m* m4 s/ S: N2 _+ f/ v8 l+ m
    5 o8 X+ W. Z6 s' v5 C/ p
       假设n个字符里面,有 k个英文单字,i个中文双字, X+ l! X$ u% G9 [
       那么截取的时候只用考虑最右边的i个的字符
    / r! U! ^! {# v" ]
      s2 r6 N1 W# w! @   assume 左边都是英文单字的话,那右边的就全是中文;: R) s: y- L$ `. {; m; {
       如果全是中文,那么有几个中文 就截取几个字符
    ; b5 k- ~8 a! ]% ]$ @' L/ ~
    1 |9 i  t9 G3 W迭代的函数 输入应该是字符串,输出应该是左起的n个字符$ |. w4 w3 B& ]) w
    迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)6 [6 `2 v3 F  m, y/ B
    " x4 }1 |* l9 N9 _) f. m
    迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
    5 Z9 D0 j. h- U7 C-------------------------------------------------------------------------------------------------------
      E5 O2 h; ^6 A0 @, fif(!String.prototype.leftB){ # W2 U7 ]; {; G  c! n  O8 z
    String.prototype.leftB = function(n){ //n=7+ {' H. S( @& i/ r1 H
    var s = this, //s="ilove我自己"' D' r, @+ X- {. x& b
    s2 = s.slice(0, n), //s2="ilove我自"9 j( l( a6 @9 u3 }1 a  W
    i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9
    7 @3 I: w$ F5 {: @4 N1 x$ Vif (i <= n) { " ~4 T' r: g  c9 T, b, a! }
    return s2; k
      Q& D2 l4 p! W/ a; {7 k} % U" e% D+ o7 Z
    i -= s2.length;// i=9-7=2 , n =7,几个中文
    . B5 d5 s0 t0 p* S/ Wswitch (i) { & A7 D  H7 \$ z. l) p1 G; k
    case 0: return s2; //全是单字节3 Z" g3 E' a. z
    case n: return s.slice(0, n >> 1); //全是双字节,比如中文; N# {. |6 ~% q/ A. Q, O( G7 f( `; C
    default: 8 T9 T9 f; S6 q' U' u
    var k = n - i, //k=7-2=5,几个英文字" @8 |8 Q# p7 i( ^6 @
    s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
    ( G, y) h! |6 z7 k% y, g2 aj = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数/ f- A% h3 `! S) U# ?
    return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
    6 ]/ b7 o# g. O3 t! K}
    1 n$ w% C7 L4 K" h4 }}
    - o( o# K  n# |2 n. A9 k) l}) v8 ?  z6 E/ J5 S- T; ?& Q5 `
    -----------------------------------------------------------------------------------------------------------------; \8 w! e' N1 w" M, v
    var stringify = function (obj) {% B" [" B5 W. j4 l8 c
        var t = typeof (obj);2 |; o# U- W3 t
        if (t != "object" || obj === null) {, ?1 Q+ b4 n. K3 Y( y" W% m9 b
            // simple data type
    6 k- {1 {5 S) g; r- l1 d* C        if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
    . {; A0 j# |! l7 \8 k, I        return String(obj);, G$ W7 z0 X' _5 i6 O# {
        } else {! t/ S( u4 Q1 B8 }
            // recurse array or object
    6 ?, \8 Q7 l9 Z+ {5 K        var n, v, json = [], arr = (obj && obj.constructor == Array);/ v/ M. f  d/ i% m

    7 L0 A6 x8 z# O        // fix.
    5 `' n5 T0 D$ Q& `  v        var self = stringify;
    0 `+ H0 l% R" s3 @/ W0 C/ @2 G) L, Z+ Q
            for (n in obj) {% w: c( D0 z( \  H
                v = obj[n];! O1 T2 n% _5 i9 M% D
                t = typeof(v);* U) t: `. d/ ?2 L  x/ j9 K$ @
                if (obj.hasOwnProperty(n)) {1 a8 ~* O& \  b) v4 q$ I
                    if (t == "string") {
    2 @5 g, U' ?2 L7 d                    v = '"' + v + '"';
    $ w5 v6 p$ f- G) S                } else if (t == "object" && v !== null) {
    ) v2 x/ n3 g1 r' a/ c                    v = self(v);
      n$ A# A+ W. B/ g0 v' z5 S5 B                }
    # q' ~7 c" e8 C9 ?! Y) ^3 r                json.push((arr ? "" : '"' + n + '":') + String(v));
      `3 Z% o3 w' v% K% u            }; J$ D8 ?0 J1 m( X8 R# P" p: m
            }
    1 [6 I0 o5 x$ I' A" o        return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");: h! w( I0 A) }, F- f9 l
        }% A% B) U0 b; V6 q
    };
    " g6 F, h5 D( M7 e% r& V( O( O: K9 @  Y# g
    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-30 21:39 , Processed in 0.405693 second(s), 50 queries .

    回顶部