QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)/ i/ ?3 F0 M. z
    算法:% R5 ~  d- \5 i
       英文是单字节字符,中文是双字节字符,8 P9 o3 |: J2 {  ~0 s2 ?& u3 x" |
       如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源
    ' o, m0 o7 T* M, L5 Z' R: A1 b
    9 a3 h3 }9 m" c5 w6 o$ L. L   假设n个字符里面,有 k个英文单字,i个中文双字
    7 Z, B: w: y1 R! P/ e+ z2 e   那么截取的时候只用考虑最右边的i个的字符
    * d' `1 [0 W% l. L: w; y+ h% Q% H2 E- c% e' l) k- }. [5 J/ h
       assume 左边都是英文单字的话,那右边的就全是中文;' u7 u. {2 J- b4 b( \+ y( w
       如果全是中文,那么有几个中文 就截取几个字符% G+ J, I- L" u0 n* n5 K

    + w7 ?. _4 u% P  o) F迭代的函数 输入应该是字符串,输出应该是左起的n个字符
    ) W$ S6 Q  P5 ]迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)
    1 T. c4 Y; x! ^* S& ^$ D. ]$ N; _: ]" F% I6 b3 Q! s
    迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代' f9 n( L2 ]' {# a; a" G- {8 s! l
    -------------------------------------------------------------------------------------------------------4 j+ l9 y3 x1 R# ~9 L
    if(!String.prototype.leftB){ $ }7 M) D8 M) w2 ~
    String.prototype.leftB = function(n){ //n=78 x: z1 z" Z* }* {; X
    var s = this, //s="ilove我自己"  F3 I5 V6 X' f# y! A# Z( [! `
    s2 = s.slice(0, n), //s2="ilove我自"% `! m' x, ~, t: A: H1 j  E) H
    i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=97 K+ c+ c( R3 |. N6 r* t
    if (i <= n) { 5 n0 v! f. q9 t5 W7 ^
    return s2; k( s. v5 O, \. X# X1 G: M
    }
    & T% }' n% s2 D" D$ i0 Ci -= s2.length;// i=9-7=2 , n =7,几个中文
    / r8 e+ P' g& ?; g9 t. fswitch (i) { ! O5 y+ w7 W% L3 k) a& t5 W+ @
    case 0: return s2; //全是单字节
    ) H( g1 l0 \% s' a8 pcase n: return s.slice(0, n >> 1); //全是双字节,比如中文
    0 T4 M0 B& i0 J( x  Jdefault:
    6 e1 \! F. H# ^& t1 G" |4 mvar k = n - i, //k=7-2=5,几个英文字, N7 f( f# r; I% p3 C6 q4 V
    s3 = s.slice(k, n), //s.slice(5, 7) s3=我自") J9 W! S) l1 R4 y: \% ?4 {* T; ?4 P
    j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数7 |4 v( H/ N1 p/ Z8 G" [: Y! L
    return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!/ t- z6 q* [& E" `
    }
    / }* }; G+ G) Z} & h+ K8 k4 D# Z
    }# l9 V' i* F# r/ V. ^# r. ]
    -----------------------------------------------------------------------------------------------------------------
    + m" G9 ]8 N3 P, S( L4 h9 Vvar stringify = function (obj) {- q4 l( b+ m9 a$ A% C5 J
        var t = typeof (obj);9 i$ Q3 D  E5 t( F* [, }4 D
        if (t != "object" || obj === null) {
    4 K- q8 [% r; K% i        // simple data type
    ! E! Q$ j# M! w9 B7 \# c        if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
    % h) I) q3 m8 A. L        return String(obj);
    9 n/ G- H6 n+ N! ?* ]    } else {
    3 Z$ t& x, }; ^# ^; ^        // recurse array or object
    7 g$ g# [$ b( Q        var n, v, json = [], arr = (obj && obj.constructor == Array);
    , }( I! ]) v& ~# A8 Q
    3 S2 z: V5 l0 Y$ J6 ^        // fix.( O  @, j" ~% l( W! O" `8 w. i
            var self = stringify;' j" D5 u" F$ j7 O8 c+ G; \
    9 `) E# u$ O! B( F- D/ \1 z
            for (n in obj) {% A& K/ U5 C. z. Q3 B
                v = obj[n];
    1 E$ b+ |1 n! d& a& _            t = typeof(v);) x  P" C5 y6 [8 U/ A
                if (obj.hasOwnProperty(n)) {2 f# L3 B( j  O2 z2 k* \9 u
                    if (t == "string") {- ]# s) q9 x; p) R, o5 f6 K8 ]
                        v = '"' + v + '"';
    . Z6 v, T6 p$ E: c/ G                } else if (t == "object" && v !== null) {
    " |0 G' C! y% V                    v = self(v);
    , W- e. {: t+ x                }
    # m7 x1 P% @7 E& T4 A& a5 W0 J) d/ A                json.push((arr ? "" : '"' + n + '":') + String(v));
    $ p8 k/ |* A/ `            }4 }" j, b7 R2 C9 ~
            }
    8 p/ c$ t, j4 k8 t8 Y  Q        return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");+ p) y: N' p  w8 ^  @0 K
        }" s! X0 f6 O1 W6 T8 |
    };
    9 a, S5 T0 x7 t3 N0 @# ]+ f/ Q/ z2 K, t* T* r% O- w1 C
    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-4-21 03:13 , Processed in 0.401165 second(s), 50 queries .

    回顶部