QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)
    % |, G5 t3 w# Y8 Z$ s, E算法:0 t; S2 b% `3 t' w
       英文是单字节字符,中文是双字节字符,4 V" r& s( {$ ]# v9 n: w  F, s
       如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源7 I; P, u  P4 s) o# b; X- I

    % _' k# H! d: }5 X* T3 ~6 g   假设n个字符里面,有 k个英文单字,i个中文双字; o. I+ z" `' N1 T& ?# u# i4 F0 P
       那么截取的时候只用考虑最右边的i个的字符4 n- y+ P6 @) ~* J

    1 O3 N8 L8 x( a  @& ?   assume 左边都是英文单字的话,那右边的就全是中文;1 [7 J+ u7 ^$ ?2 w( {4 \2 q0 c
       如果全是中文,那么有几个中文 就截取几个字符" _" D) m# [0 B* E, A! X. o

    0 s; H) v+ m& {3 b# `- D迭代的函数 输入应该是字符串,输出应该是左起的n个字符* r7 E0 `0 `! ?) k2 a
    迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)$ K* l8 N3 [- v( g. N) C% Z. m- M3 t
    & X8 j# I2 P  s8 s2 P5 j$ [
    迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代' Q+ m, v1 y# j
    -------------------------------------------------------------------------------------------------------
    # F# e, d( P2 n/ V$ Y" Rif(!String.prototype.leftB){
    1 R  ~. P1 `% A' R) d0 }String.prototype.leftB = function(n){ //n=7
    ( V6 z& J# Y" s* Z  Qvar s = this, //s="ilove我自己"
    2 u8 O& k1 V6 ls2 = s.slice(0, n), //s2="ilove我自", g- K/ i- O, e2 L
    i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9
    : z/ M% e, u9 p: O6 y' k4 {7 o4 u# Mif (i <= n) { ! z( O; M( k2 z+ {
    return s2; k
    $ \9 O' b" u; c! N3 N& j$ t} 2 J7 B  N/ c( x. t9 @/ L. ]8 p
    i -= s2.length;// i=9-7=2 , n =7,几个中文# W& {' n- B1 c5 O3 M0 }
    switch (i) { + V0 X. U) ]- X9 S% o
    case 0: return s2; //全是单字节9 \1 H2 j3 V$ U! s# S8 w  F
    case n: return s.slice(0, n >> 1); //全是双字节,比如中文. C. @, ?4 }' X+ o4 O# F+ i* C
    default: : a# A8 ~7 p7 d! Y
    var k = n - i, //k=7-2=5,几个英文字6 }3 O# W8 T* ~$ f: _0 W) h  f
    s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"2 A. z% L1 M, |" ~
    j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数, @" x% G4 L2 g* r" D
    return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!- l# R9 m8 f6 Q" I
    } 0 v! k3 p* E& p3 m- L4 g
    } : X/ b7 D- `  h/ [* w' R
    }: h1 [1 w8 G7 [7 \2 l  B
    -----------------------------------------------------------------------------------------------------------------
    ) P! k6 X( b# I% S' lvar stringify = function (obj) {
    + V- X1 T7 D$ ?    var t = typeof (obj);
    & T0 `( Q6 y6 ^3 f    if (t != "object" || obj === null) {
    # o3 L8 J; m! S* u; o        // simple data type
    - K$ x  D9 N+ @# ]6 V        if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!+ @  q0 x( ^1 c; t9 W) Z
            return String(obj);
    5 ?( U1 U9 E" o* K+ D    } else {
    2 f- H5 ~5 S# D  r        // recurse array or object
    : P/ j2 p5 P# r% k! t) G        var n, v, json = [], arr = (obj && obj.constructor == Array);
    7 E# M* _( Q$ V) v& r1 X3 o: f6 v' \2 F* ^+ Y1 Z! N* x
            // fix.) N4 D' o2 P3 ]( k- X4 r$ K
            var self = stringify;
    ' ~  I* |' i& ?: v! D" e
    6 X2 [# D$ ^' @  Z( F        for (n in obj) {' T6 W6 b+ w. T/ I# A8 }5 |
                v = obj[n];% y# n+ w9 E; a! H
                t = typeof(v);8 P( h8 e( h* u! U
                if (obj.hasOwnProperty(n)) {
    4 b; C8 `, z9 ~3 |& l                if (t == "string") {
    " t- N% I& H) U4 C                    v = '"' + v + '"'; ! c6 F0 C& V2 k
                    } else if (t == "object" && v !== null) {) ^9 K/ B* e. f( W
                        v = self(v);
    ) X- V# F9 v8 O* x/ k7 |                }4 \" T4 ]# t4 d& A
                    json.push((arr ? "" : '"' + n + '":') + String(v));
    % B0 a' B* n/ S            }
    - E+ u( G, L5 S  Q7 @        }" {4 s3 v" f, E5 M. v4 j% c
            return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");0 x4 r# G3 O0 }+ h+ V! [, ?% m
        }  p4 j7 N" C% e
    };% j. x! Q  ?% H* w& z% ~/ a- K4 Q
    $ r. x1 A9 R  D+ V/ ~: |; y' [8 s
    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 13:32 , Processed in 0.415576 second(s), 50 queries .

    回顶部