QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)
    ; \4 L1 C# t- i& W1 W2 r算法:
    . m* o$ |+ B) \. Q, X. l   英文是单字节字符,中文是双字节字符,
    6 [2 Q- N% k$ @' l" w7 l   如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源% @- C  w  D! d* F7 u  l- i: ^
    6 g3 O2 z1 q& X: x! |# j
       假设n个字符里面,有 k个英文单字,i个中文双字( w( \! Y8 m9 @  Q" [$ ]
       那么截取的时候只用考虑最右边的i个的字符, n; [% ^3 V4 @0 d5 @$ K

    - n  w8 b% t( _1 T+ z   assume 左边都是英文单字的话,那右边的就全是中文;
    8 Q; f0 Y; @! c  D$ C7 P1 Z   如果全是中文,那么有几个中文 就截取几个字符
    + i* ]7 E5 p/ _
    ' Q5 p- |' }* K- w& n% B% W5 X迭代的函数 输入应该是字符串,输出应该是左起的n个字符
    , _3 I1 b( o# k: ]" |, u. B迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)5 c( s2 Z6 B! p' N' R' `
    # ?. N0 z7 q- t# i8 s
    迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代3 w' q" U/ z$ v: S; g; i
    -------------------------------------------------------------------------------------------------------
    ; H8 e, a9 |9 H& Q  ]if(!String.prototype.leftB){
    6 }, |$ @/ i) t. E4 l4 o) IString.prototype.leftB = function(n){ //n=70 P' v0 b: c: p( [( l
    var s = this, //s="ilove我自己"# g( k8 V, M6 D* {3 N% c3 \
    s2 = s.slice(0, n), //s2="ilove我自"! Y7 j* v; ]4 h3 V, F* e
    i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9# p2 t# a. I/ P0 w6 o( w/ O
    if (i <= n) {
    : a' z& p+ A2 x! E  {- v- p; freturn s2; k  |* M/ R) m7 f9 W0 J" K3 z
    }
    / b9 \2 z6 Y  N9 wi -= s2.length;// i=9-7=2 , n =7,几个中文
    ! d6 I* }8 V6 \/ B. yswitch (i) {
    5 z# H1 @8 ^% Zcase 0: return s2; //全是单字节5 `7 r. E9 C: D& k" h) N
    case n: return s.slice(0, n >> 1); //全是双字节,比如中文
    ) h# Q( j2 I, qdefault:
    9 z! F& `' E- m# q: ?var k = n - i, //k=7-2=5,几个英文字4 U  U7 R3 G( s$ E8 u- j" O8 L
    s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
    " `& ^" d6 b, }+ z% ?& D' h# o5 jj = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数1 @5 |5 F3 n3 y6 x9 f2 ~% f- U1 t
    return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!8 o* K9 |3 T1 B* y4 z- I' p
    }
    5 l" R) V; E% u! X9 Q0 r}
      O) m' b: _0 G}- |2 B7 P) r) F! k, S
    -----------------------------------------------------------------------------------------------------------------
    ' Z( d9 f2 y' O3 X( f2 S8 fvar stringify = function (obj) {
    8 |  j/ I6 i( V* g% M2 q9 b5 n6 P7 @; o7 p* ]    var t = typeof (obj);
    + C  o( A) Q7 E2 ^. `, t2 U8 A    if (t != "object" || obj === null) {# ^" N  r; x/ J$ k% u) q' J
            // simple data type
    9 B) a5 H4 y" ?7 I$ {3 Z        if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
    8 Z* P6 F+ H: S/ Q. S" N# E        return String(obj);  w* [# d3 P" o+ @  \% i/ f
        } else {$ D/ n3 F; x9 l: \* i( K
            // recurse array or object
    2 y- b) _* L  H2 {* f        var n, v, json = [], arr = (obj && obj.constructor == Array);
    % O7 J" I- B# r( k* [
    ) V0 w5 ?; v- j+ K1 F; ]0 y/ I        // fix.
    4 o( L; a4 a+ }+ t        var self = stringify;
    5 L" v  W( E1 Y& _
    ' F% X/ w" h0 |$ Y3 f) K% Q2 o8 Z        for (n in obj) {
    ! m0 T; p; ~1 w8 m            v = obj[n];
    0 ]$ @- ^1 s: Q( S            t = typeof(v);" _% N. v5 ^3 V) A8 ~9 b
                if (obj.hasOwnProperty(n)) {
    $ p3 a4 O9 ^! m6 E" W' _' q                if (t == "string") {
    # c9 C% g. ^6 e+ G4 x                    v = '"' + v + '"';
    ) b5 c1 o7 l( l0 j0 z' ~                } else if (t == "object" && v !== null) {
    6 Y' g  c7 h2 H1 ]/ K9 n1 I& ~                    v = self(v);/ G( @7 U6 G8 }6 k
                    }/ i6 s# C$ z8 Q- ?5 M
                    json.push((arr ? "" : '"' + n + '":') + String(v));! F* t4 a! F7 s  B. z
                }" c, ?0 I* m0 I* E8 N+ p% T1 e4 Z
            }
    5 M- |  A2 s) ^! H+ X* z1 [        return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");4 g( x8 t! b6 z% }5 A+ T
        }+ L) k) i6 S, Z  h+ W
    };* `$ q6 _- y  ]  W' c# Y. ~& f
    / s  ]( h  l4 }2 Q
    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-13 22:18 , Processed in 0.919331 second(s), 49 queries .

    回顶部