QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)0 p% }& n, ~# g: z
    算法:
    + W0 N6 _1 ~5 f( ?1 y) |   英文是单字节字符,中文是双字节字符,
    ' `# k$ ]( o- [# I( C% Z% U   如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源9 F+ V/ g# x4 I

    & c4 ]/ H! u0 n2 n: `; c& ~# g9 L   假设n个字符里面,有 k个英文单字,i个中文双字
    * R( K, A" ]5 X+ \9 I/ i+ M8 Y   那么截取的时候只用考虑最右边的i个的字符
    ; K/ w7 O3 p- m) z% X' ?4 \) w& |4 B4 v8 ~" `- K* b& s5 F9 T
       assume 左边都是英文单字的话,那右边的就全是中文;( Z! o4 t/ _3 h0 d! v, t
       如果全是中文,那么有几个中文 就截取几个字符- m, q  ~) N" _
    4 T# T0 b6 l/ K7 r* G$ q
    迭代的函数 输入应该是字符串,输出应该是左起的n个字符# u5 D9 x( L& @) ?
    迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)6 L  O5 W- F, n( V- S1 ~7 N
    9 N+ s: G) b8 w  g3 k0 D' C
    迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代; g7 F# G# \+ Y1 ~$ L
    -------------------------------------------------------------------------------------------------------3 _) A- y4 e) S
    if(!String.prototype.leftB){
    . j+ |1 N* u4 ?) C$ tString.prototype.leftB = function(n){ //n=7
    5 ?# r" m. ?$ avar s = this, //s="ilove我自己"* u+ O. z" J5 @4 p
    s2 = s.slice(0, n), //s2="ilove我自"
    % g1 o9 S  j0 F) f2 X4 t# bi = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9, e2 ]$ o, L0 E" f3 Q1 {
    if (i <= n) { 7 M, q, l, K: v2 P
    return s2; k
      ?5 b* J* Q& E2 \1 m}
    ) |) Y3 Z: c3 o4 q' m# g$ Ni -= s2.length;// i=9-7=2 , n =7,几个中文6 ^$ s! L+ {! j+ x, E' n8 r2 _
    switch (i) {
    % @0 k; v% t+ B, d8 q6 tcase 0: return s2; //全是单字节
    : p! R6 P6 O! i+ ?# r5 bcase n: return s.slice(0, n >> 1); //全是双字节,比如中文) ^0 D0 j9 ]4 C* x1 D
    default: / @% p" R* q( T: i3 E4 W, f
    var k = n - i, //k=7-2=5,几个英文字# s  ]  P$ e* u* v" w( _  F
    s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"& B0 d- o( [2 m% [7 f7 D
    j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
    : e" J- C3 r: p  ereturn j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
    3 c2 q* M, x+ v" B+ j4 s% U} 9 v0 @+ k/ M$ q% g. e3 C1 G2 L
    } + H4 s& n) o9 l4 Q4 S
    }
    9 E$ n7 N0 U- m, N  M8 \; @-----------------------------------------------------------------------------------------------------------------
    5 `& G! R9 X# r' evar stringify = function (obj) {: t7 U* c* F2 Q  X8 M
        var t = typeof (obj);
    $ A( [* C. A" v; Z) n+ b    if (t != "object" || obj === null) {% }" o/ }5 P  w
            // simple data type
    9 D3 Y5 q# b6 W2 T        if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!- l: p4 P! M- }6 D" a" k
            return String(obj);# Y! A# Y8 Z+ C' j9 p% y+ k3 _/ X
        } else {
    6 Q' v" _8 F/ X, t, ?# C  W        // recurse array or object- @8 h1 n: m$ [7 C! V$ Z
            var n, v, json = [], arr = (obj && obj.constructor == Array);) v; e/ K" n8 D9 |

    5 g' C, ^9 y: |$ x        // fix.' M9 J3 B6 \$ n- ^1 `6 ]0 J
            var self = stringify;1 {0 ^% O! Y. F! D: ?+ Z; @
    " j6 M% e& S- J' ]. u' i; n
            for (n in obj) {- E2 f# a. B$ G8 R
                v = obj[n];: D4 O+ P; Y* D5 U7 Q. L5 }
                t = typeof(v);# c. E. }" v- H- ?+ \: [( d& s3 \
                if (obj.hasOwnProperty(n)) {
    2 u8 h) q* d: i                if (t == "string") {" v  w: q# B' y5 ?" E5 A- Z3 z
                        v = '"' + v + '"'; + e+ c/ i  Y  m9 l8 B
                    } else if (t == "object" && v !== null) {: e1 l; D7 G) s( w
                        v = self(v);+ Q& B0 b# I; P( p
                    }! N; i! v0 \# e9 g7 ]0 |9 {
                    json.push((arr ? "" : '"' + n + '":') + String(v));0 Y5 V' K  v4 p7 f. K4 ^8 ^
                }. T% x1 d: w2 a; y4 f  I
            }+ `3 ]( F3 q  r
            return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");" s- G8 B( T4 c& f- g" [
        }
    + _5 U5 E- ~, z  {# J# h9 V& @};4 g9 U. G  A; {, r  E
    4 P# f0 y: E# u
    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, 2025-7-30 18:22 , Processed in 0.320043 second(s), 49 queries .

    回顶部