QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)
    $ V- |- B# i; F+ V算法:
    ( M2 Y9 y* [8 n5 n   英文是单字节字符,中文是双字节字符,# f! k+ C' T; m) L% Y2 H, w
       如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源1 b2 {1 E" b/ l# W4 y9 H
    % A* a4 y( a: x% l
       假设n个字符里面,有 k个英文单字,i个中文双字
    . U7 H6 H* o' M7 C( Z" h" c: L   那么截取的时候只用考虑最右边的i个的字符9 t) q3 G( A4 p' u5 S
    8 p8 h# d3 h6 ^# l
       assume 左边都是英文单字的话,那右边的就全是中文;1 A7 x( W, O2 ~! h
       如果全是中文,那么有几个中文 就截取几个字符4 h5 U2 m# H; B) r1 `4 H
    ; W; e8 F# N7 W
    迭代的函数 输入应该是字符串,输出应该是左起的n个字符
    5 W2 t1 J: F) H  ~0 m; y6 W迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)
    3 D2 t5 D  A$ P+ l' \$ |9 ?' `. B+ J7 y* I# ~
    迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代: ]! H3 t- |  w9 j2 n6 _% q1 e" N
    -------------------------------------------------------------------------------------------------------
    # m+ J9 G7 L, E$ b8 f8 }if(!String.prototype.leftB){
    ' A3 D+ A2 @6 zString.prototype.leftB = function(n){ //n=78 l% n0 T8 H! v
    var s = this, //s="ilove我自己"
    / Y7 j8 w" k. X- J0 f. t! @s2 = s.slice(0, n), //s2="ilove我自"
    , p% D$ j  G; i$ e; \i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9
    % A1 w" W+ f( e8 oif (i <= n) {
    6 u/ T. `* v* a; Y1 E9 i9 Ureturn s2; k! T  l3 A8 Z. o- {# i
    }
    6 p# B! J& A, w. r- T9 yi -= s2.length;// i=9-7=2 , n =7,几个中文
    5 [! X! X: K; j1 vswitch (i) {
    / _4 u$ ~8 c  x0 Ycase 0: return s2; //全是单字节5 B7 i; e: }" g8 h3 D
    case n: return s.slice(0, n >> 1); //全是双字节,比如中文
    2 e  y* B2 S4 Q: w8 V  u, tdefault:
    5 Q( n+ t# ?+ `  u! u% Tvar k = n - i, //k=7-2=5,几个英文字
    ! q$ t2 b' @3 _) Q3 xs3 = s.slice(k, n), //s.slice(5, 7) s3=我自"4 V9 A3 A9 p! O3 i* y! s- K
    j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
    / }' L- K7 Y* d; P# k2 Z/ Zreturn j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!( A2 Y! K+ d  @
    } 9 j& T0 y7 V/ m
    }
    0 |6 o' L: U8 M% C+ [}) A& s+ @( O6 `7 j; F+ y! m
    -----------------------------------------------------------------------------------------------------------------; J. `+ Q: z" A7 ]& f
    var stringify = function (obj) {
    7 g- A  C4 P! }4 X    var t = typeof (obj);8 F9 Q" E& L8 I  ^1 t( r$ r
        if (t != "object" || obj === null) {% M2 _- n- M, u7 |0 ?
            // simple data type+ }& w7 `& K+ ^1 R
            if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
    ; p6 g7 a; i: v9 ~        return String(obj);& }+ [* |  P. X
        } else {  U- j! W0 L) Q1 m; l, {
            // recurse array or object$ u$ U% Z" F0 k* S! [
            var n, v, json = [], arr = (obj && obj.constructor == Array);
    ! n/ F+ w$ S5 e2 L: p1 D3 ?8 b2 B, K. [
            // fix.
    ! f# |+ F, B* A5 [, B& U/ e& Z        var self = stringify;  g' c4 j' E! M3 o, Q/ e( b) a
    6 ^8 A0 k1 X+ w. ^. r4 q. c/ ^3 n
            for (n in obj) {- f4 y1 z; |; v, o
                v = obj[n];: W  T  ^( V/ L5 o2 c" o
                t = typeof(v);
    3 x9 S8 p! c* C! @/ Z            if (obj.hasOwnProperty(n)) {
    7 b$ {3 J8 S3 n5 s                if (t == "string") {
    ; I$ P4 r0 ~) d6 A( ?                    v = '"' + v + '"';
    1 }# u2 }& d3 ]- o; G                } else if (t == "object" && v !== null) {: q+ ^0 B# V! r* g* v& P) g
                        v = self(v);
    0 f6 b1 c* J' X                }$ ]2 d. B+ K& p6 t0 ~
                    json.push((arr ? "" : '"' + n + '":') + String(v));
    * h/ I, X# d2 h4 v            }
    5 P/ z5 k5 Z2 c4 Z, M: R- d0 \        }* o# N, v- e0 V. c3 p6 R
            return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");. ?; }+ r4 x' i3 L! P4 l
        }, H% a1 x2 x6 ~" i$ O' H0 I
    };
    2 k8 S" D' l2 E2 f  }7 d3 N
    1 ^" c2 J2 i- j+ g* L! c) i* [  a* E
    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-6-14 07:33 , Processed in 0.317337 second(s), 50 queries .

    回顶部