QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)
    1 f: x; L- \1 r算法:
    " X% x4 W1 u7 E; p   英文是单字节字符,中文是双字节字符,! b5 t. O. ]. h5 k' \
       如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源) w+ j' i8 T& Z, z+ i
    , S+ G- c: U; n+ I# b  m- E% r/ `
       假设n个字符里面,有 k个英文单字,i个中文双字
    1 q) q( ^/ T+ ?# G& {6 z  P   那么截取的时候只用考虑最右边的i个的字符6 z$ Y) x5 z/ m, J0 G

    0 \9 ~; U# w1 w% B   assume 左边都是英文单字的话,那右边的就全是中文;
    9 b+ S" a  o, N  D* \2 |: q   如果全是中文,那么有几个中文 就截取几个字符
    / R2 y9 p7 ^& {3 |0 M" C, g1 z/ b9 m4 u5 H
    迭代的函数 输入应该是字符串,输出应该是左起的n个字符- w# K. o: j4 L: d. W
    迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现): m5 K( A1 O0 \, n
    . ^) u1 B7 L$ y4 C' C& q5 E/ H
    迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
    6 A. q/ p- M8 V4 _-------------------------------------------------------------------------------------------------------& W, \7 p( q) F" _6 t
    if(!String.prototype.leftB){ # |3 x5 J) |& U0 h! a6 X
    String.prototype.leftB = function(n){ //n=7
    3 w$ b1 d7 P, F" ^2 _! Svar s = this, //s="ilove我自己"" j. ~( L. ?# B% M
    s2 = s.slice(0, n), //s2="ilove我自"
    8 L4 D- O/ @# H' X3 S+ o) W5 n% zi = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9
    ; ^  l0 L9 e7 Q/ [if (i <= n) { 1 m! g" P  o2 b6 g# @5 W
    return s2; k
    ( U  G. t7 P# @, W6 q+ S! j}   `# _  n" Z5 D, D0 q
    i -= s2.length;// i=9-7=2 , n =7,几个中文4 y* N- t4 Y" r6 Z/ o9 Z
    switch (i) {
      s9 R# W1 |7 H& bcase 0: return s2; //全是单字节
    : s: j4 Y6 _) [% Scase n: return s.slice(0, n >> 1); //全是双字节,比如中文
    4 l* q1 T4 W% y3 h: t. Zdefault: 9 s- W1 ?6 |! x+ ?9 F4 T3 I) {
    var k = n - i, //k=7-2=5,几个英文字
    4 |* E* U- C6 k* m8 @1 z5 {( }, Ws3 = s.slice(k, n), //s.slice(5, 7) s3=我自"4 \! r$ e# L, i9 M) W- N5 Z
    j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
      b9 }+ B2 x* K1 G; u( d! D9 `/ }: z- }return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
    ' ~$ G. Z  N1 g! r  ?  d: R} . O5 ^2 j3 v+ k2 @( @% R
    }
    ; g9 a6 h. i: K: B) u6 B2 g# Z}
    ' \: p; ^/ J' Z+ W6 e+ Q7 X* Q-----------------------------------------------------------------------------------------------------------------/ r6 o/ F* u% N. S
    var stringify = function (obj) {. X0 o, G1 h$ K: G. ?
        var t = typeof (obj);
    , ?- Z4 z6 U# J, E+ t2 ?6 \8 R- B    if (t != "object" || obj === null) {. c. t3 \# Z- O5 P, Q, _8 @) J$ |: v
            // simple data type
    " ?8 q: B* r% F( |        if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
    0 h8 V9 g% m/ m% E" `        return String(obj);
    , `+ D5 D! Q3 r! V7 ?" Q    } else {
    4 _4 U, u: t+ z        // recurse array or object
    8 n$ {9 M1 k1 X4 K  o7 h        var n, v, json = [], arr = (obj && obj.constructor == Array);  k' z& L/ _$ w3 B7 \; u. v

    & r- L( D! s) W% `. o        // fix.( O& p6 Y1 F: t* Y$ s' H
            var self = stringify;
    . F  r( g# @5 l' O) B! ]  {, `. V; m; i( \7 W
            for (n in obj) {9 c8 Z$ @& [/ |% U5 F- k0 r3 d
                v = obj[n];
    ! D- h+ }5 N# Z* A: O; F            t = typeof(v);' n0 _6 P8 ~" }1 y& p% I+ M
                if (obj.hasOwnProperty(n)) {7 E# j! `. f9 P. r3 H
                    if (t == "string") {
    . j9 m) v& H" r- O                    v = '"' + v + '"';
    5 w4 X' B! G' H, ^  F; @, S4 Y                } else if (t == "object" && v !== null) {
    % c5 _* R8 s+ T, W9 `                    v = self(v);
    : z4 S5 T4 p+ X9 v3 }                }
    2 x2 `: Y" Z& v" h' V! i                json.push((arr ? "" : '"' + n + '":') + String(v));! f& y5 C/ R( W9 t4 a) H
                }
    % z7 N% b; u2 m# Q) X8 l4 {        }
    ' `' X, ~9 ^5 P$ K# W0 d7 ?        return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
    & @) D0 {3 \: S6 [+ F# c    }
      g  \2 B' A- B. X0 H7 Q$ e8 F+ n};, P9 g% q4 _) F$ @4 e
    + s  s: P! [; X3 |3 s: }7 v
    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-7-30 04:38 , Processed in 0.280697 second(s), 49 queries .

    回顶部