QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)3 E7 B* E& U* l) C3 O" b* l7 R& Q
    算法:+ e- L$ F9 n9 p8 l% N: I% s4 E
       英文是单字节字符,中文是双字节字符,& B: i- r- [! P7 n2 d; s
       如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源) q' D% B+ Y0 S+ d# D% W
    : B, `% D6 [  @( h
       假设n个字符里面,有 k个英文单字,i个中文双字+ i+ C3 y$ x1 c* Z
       那么截取的时候只用考虑最右边的i个的字符
    ) e; K# f' ?) ~1 u4 H* c  ?* c7 D$ }' `
       assume 左边都是英文单字的话,那右边的就全是中文;" m% D: l7 p% l  d+ f$ [- D9 a
       如果全是中文,那么有几个中文 就截取几个字符! H2 e7 }. O- z! Z

    . H- P4 J; m  I: d1 a3 s迭代的函数 输入应该是字符串,输出应该是左起的n个字符, u9 |* J, t# H% g
    迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)
    : T# @. @; M5 ?& V7 D+ d
    : V( G- X5 q' w2 N迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
    2 C4 [( A/ \. H( m( W9 B-------------------------------------------------------------------------------------------------------2 }1 Q9 l3 E( \) R
    if(!String.prototype.leftB){
    . z5 G1 U  f& O: F) A3 oString.prototype.leftB = function(n){ //n=7
    ) {6 |0 t% `: p0 ?7 s8 q; kvar s = this, //s="ilove我自己"! q  T- `4 k" D( S$ M! ]6 h: j% b
    s2 = s.slice(0, n), //s2="ilove我自"* @# _1 T8 k, j. M  Z6 H
    i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9
    : h- v  ~9 q. cif (i <= n) { 3 {) ]+ p6 v  H- W! M
    return s2; k0 @5 ~; H( b- K* W* g% c: s
    }
    ' w. B( g- ^9 b1 ki -= s2.length;// i=9-7=2 , n =7,几个中文
    6 b% t% F( l& b3 c: f6 hswitch (i) { ) D' U- a! f1 V. K% w, Y
    case 0: return s2; //全是单字节- R  m# O7 }# u
    case n: return s.slice(0, n >> 1); //全是双字节,比如中文1 y" o- [5 O2 Y/ V
    default:
    % Y  E; u# Q3 n/ Bvar k = n - i, //k=7-2=5,几个英文字
    ' ]9 T& ?" i3 {. \) [, Fs3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
    ! s7 g4 e" c2 ej = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
    7 e+ C0 E1 C; ?; ^$ @6 p  g4 Ureturn j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
    $ i: Y  H: V- k0 a} + @$ q+ w7 ~! f* H
    }   V0 s" V' J, A* J* e
    }
    . d, K2 l5 R& N  p- P% |-----------------------------------------------------------------------------------------------------------------) m/ y; Y3 E! @2 V$ A. O6 z
    var stringify = function (obj) {3 T( B9 ]6 Z7 F! z! W( K
        var t = typeof (obj);# H5 j$ s6 q0 Z  x
        if (t != "object" || obj === null) {3 l7 K+ W  b' [8 s$ h( ]2 B
            // simple data type
    + u, x9 `+ A! S$ x0 H, \/ J2 e        if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
    : g' @. X+ r0 k3 w2 z( W5 O        return String(obj);9 Y, h& o6 N; I! X1 t# F7 c
        } else {5 j" Q4 D+ ?, j. N
            // recurse array or object, M# h' o) o( Q8 l9 B
            var n, v, json = [], arr = (obj && obj.constructor == Array);: Y3 F* K/ Y. d& E& q5 L/ n/ z8 Z( x
    - P& k$ D. J3 [9 L7 g1 C
            // fix.) ^5 z9 `- ^1 D; ]4 h% o
            var self = stringify;* |+ u4 U. j( ^5 l7 t
      W* t- J+ {6 N* p& c- M: j
            for (n in obj) {) D  [, R0 ]* }" S- X' ^, _
                v = obj[n];
    * }3 I' j& F$ s! q% L4 b            t = typeof(v);- N; U- t" z% ?' L
                if (obj.hasOwnProperty(n)) {
    3 W( W% M2 A2 ]0 W6 A$ {- w- c                if (t == "string") {3 |8 _$ b' @! V# ~
                        v = '"' + v + '"'; & X( O7 m: x+ r5 t% E
                    } else if (t == "object" && v !== null) {/ ?9 s5 D; A& q, y# ?* k; D+ Y
                        v = self(v);
      w% M: o) G) B3 C% U. S                }$ g3 Z) b$ V9 `4 V0 \- x# e
                    json.push((arr ? "" : '"' + n + '":') + String(v));! I3 p" P3 ~8 O- v
                }0 u) e$ a4 m" ~; [, m
            }0 J2 C5 I+ g5 R+ {, o3 b
            return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
    0 S2 S0 h- N$ m. M2 M2 r  I$ F( w    }
    , ]/ |8 ~5 K$ e( F  x- M};) R" p5 h0 A+ {& A
    9 o( W. S) d6 W, a
    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-29 22:02 , Processed in 0.633669 second(s), 49 queries .

    回顶部