QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)$ ~/ H2 v; C8 r( G  R0 ^
    算法:
    , k3 ]6 A4 u! g) f1 O   英文是单字节字符,中文是双字节字符,
    / y5 n; v0 o+ D( \' _9 T   如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源
    ' B/ H4 i/ f! j' i
    % r  G' X" B3 m! X( y   假设n个字符里面,有 k个英文单字,i个中文双字
    0 u, y4 T6 b6 v$ ?   那么截取的时候只用考虑最右边的i个的字符) F2 B1 y. U, s( C: Y6 o7 d

    5 j' K. ]" T- z4 U1 a' h! S   assume 左边都是英文单字的话,那右边的就全是中文;6 t+ A* u$ U! e0 Z- |
       如果全是中文,那么有几个中文 就截取几个字符! i4 T2 m* k0 N7 w$ p8 R+ E

    1 }. q! q3 m! L- a$ q迭代的函数 输入应该是字符串,输出应该是左起的n个字符) I5 E& S# m* `
    迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)# h7 `/ a! B# G7 A8 d' X

    ' D; x1 M8 _- F) o. q! H0 O  Q迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代, w7 f# _: G9 }* K8 G+ t* \5 e) [
    -------------------------------------------------------------------------------------------------------! {9 N2 I9 Z7 G" Z& t
    if(!String.prototype.leftB){ : A9 T6 I% g0 S$ T0 s# J
    String.prototype.leftB = function(n){ //n=7
    6 b# n% W4 _" r' S' pvar s = this, //s="ilove我自己"6 L) V  M) s1 T1 P9 X) e( G' h
    s2 = s.slice(0, n), //s2="ilove我自"+ U2 W9 v0 q  F0 e* J% f. d
    i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9- s6 ]- H3 V6 P; H
    if (i <= n) {
    4 N* R' }' D* H2 ^  U$ |, Sreturn s2; k
    3 x4 t0 ^2 z8 v) z: M} 6 H, k. R6 o2 o+ R, _8 u
    i -= s2.length;// i=9-7=2 , n =7,几个中文, O  J3 k/ A! y! V
    switch (i) { 8 B1 p5 Y! @3 U
    case 0: return s2; //全是单字节. z) _' q7 R2 S* h
    case n: return s.slice(0, n >> 1); //全是双字节,比如中文3 `/ L8 G3 D0 Q$ ~2 F" \
    default:
    7 Y2 j2 S9 v- ?* ivar k = n - i, //k=7-2=5,几个英文字4 e0 T+ L1 Z1 q3 G5 G
    s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"! D5 J3 b! ]' O3 ]
    j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
    . j: n& f  g. greturn j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!5 W5 G, c+ {( x" J1 M% e/ }+ D1 I
    }
    ' Q5 _9 \0 O# p: y) y2 e: e} 8 p0 Q; Q  W. }+ T* P( X
    }9 x2 j' x; b1 b" v# k$ q
    -----------------------------------------------------------------------------------------------------------------
    7 }. e; J9 ~; ]var stringify = function (obj) {
    5 B# }0 J% I. s    var t = typeof (obj);
    ( V. k5 M" f0 I( R) w4 o# F/ M    if (t != "object" || obj === null) {; i- `" X% e! g, D
            // simple data type6 w8 \* |  X0 _2 X, K1 ?; z$ C
            if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!5 S0 q/ M) l* I% e' l, l; Q
            return String(obj);% V; X; Z5 E% \' e
        } else {2 J0 ~$ Q  i+ r) J  G: j' P
            // recurse array or object
    ' V: U6 E' {9 N        var n, v, json = [], arr = (obj && obj.constructor == Array);
    . n" q/ v! }2 k2 a4 Z8 W& C( @: y+ r. X
            // fix.0 {# L& c$ |) |" |" U* V3 Z
            var self = stringify;$ D! m1 T3 U* a, h' C- v

    2 K3 Z7 C; [) T7 ?1 K. ?        for (n in obj) {; t. x  F* j& r+ g! q# Y* i
                v = obj[n];& _/ ~1 ^* X. m. g7 |
                t = typeof(v);
    5 T6 ]4 ~- @) p: G5 z- l4 r            if (obj.hasOwnProperty(n)) {: ^2 H- Q8 @) q, e
                    if (t == "string") {
    0 D8 n7 r1 t( _" x& t% f                    v = '"' + v + '"'; + E# c2 i# ^( J- W- p- f! p
                    } else if (t == "object" && v !== null) {
    6 h5 V# n, g- P& Z                    v = self(v);
    ' k+ X2 R9 j% j2 p7 a  W2 e2 m, i3 @                }3 _8 }7 h7 x1 U- r+ L: Z- }! ^
                    json.push((arr ? "" : '"' + n + '":') + String(v));; h0 |3 Z' p. N) x( g7 C' E0 n+ c  x
                }9 `' R% ]" K* W# t5 X6 K
            }8 Q4 }- x# e# E- h2 Y3 H. s# R
            return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
    3 M' V+ G  ]4 G) C1 u: p    }
    4 Y" t+ R1 ~3 e$ Y};
    ( A& T  V4 q5 e4 v7 g, V9 @% f* O' ?. Q9 e3 R% z! `
    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 15:18 , Processed in 0.504079 second(s), 50 queries .

    回顶部