QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)# w% `0 W. z+ F& W( a4 c
    算法:
    2 s0 d) Y- v% ?   英文是单字节字符,中文是双字节字符,
    * }0 p5 }9 \  H* c' F1 c   如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源, V% o* H" y) s5 t0 A2 X
    7 u* K6 I* {. M1 O
       假设n个字符里面,有 k个英文单字,i个中文双字! y4 z- L! t: O/ S9 d' D
       那么截取的时候只用考虑最右边的i个的字符- m% K* o5 ~* F/ w# b5 i, D

    1 d# u* A$ I) [! Z1 z$ c5 E0 N$ W   assume 左边都是英文单字的话,那右边的就全是中文;1 R: s! t5 R6 {3 m
       如果全是中文,那么有几个中文 就截取几个字符
    # P" S, W' k5 [$ V8 `7 ]  y& ~7 a
    ! N7 H) Y% m% E2 y* g  `1 \迭代的函数 输入应该是字符串,输出应该是左起的n个字符
    ( Z% |5 w& Q7 z! y& N8 |  u迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)6 a4 e: _, |9 |6 z
    , Q5 \/ a! A# }, W0 y0 R
    迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
    * L" l$ |1 g: j-------------------------------------------------------------------------------------------------------
    ' h6 J" I! y6 qif(!String.prototype.leftB){ + }, j# D- e" t2 D2 c9 h
    String.prototype.leftB = function(n){ //n=7
    ' E: n6 u* E7 Q' `( W& nvar s = this, //s="ilove我自己"
      |  N( ?. a8 }' G% ps2 = s.slice(0, n), //s2="ilove我自"
    ' n) p4 e* V( Y5 w, Fi = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9
    ' k9 X' t. ?% Jif (i <= n) {
    * T4 c6 e$ S0 g8 h  T! ?return s2; k
    % u" ^& O1 l( B/ o3 E3 x} / u9 Q# W( v- q- i: D# z5 E+ M
    i -= s2.length;// i=9-7=2 , n =7,几个中文
    ( c' C0 u# p" E4 ?switch (i) { 0 b% H7 E0 X5 ]) v
    case 0: return s2; //全是单字节
    * y. h* N8 c0 |5 Qcase n: return s.slice(0, n >> 1); //全是双字节,比如中文
    + d0 O/ X/ _3 m5 J: sdefault:
    0 h* F" X, m9 s7 |2 Z# gvar k = n - i, //k=7-2=5,几个英文字
    - H, J' t; a' W5 S) z8 W. T& Q+ Ns3 = s.slice(k, n), //s.slice(5, 7) s3=我自"$ u" ^/ p1 @- ^
    j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
    7 }/ U- `7 m) G. dreturn j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!7 {5 m3 f$ x6 O4 G0 L, q; W
    }
    4 ^$ x3 P* L0 l& ~5 V} + V/ x0 a- Y1 e3 v* X' f8 u
    }
    : S  X/ q' s- H; ]4 [-----------------------------------------------------------------------------------------------------------------
      m1 f5 G; ~  e3 l6 P7 X  `0 Y! a# Wvar stringify = function (obj) {
    0 h6 u: @7 K4 v% |& R    var t = typeof (obj);, [7 _2 f' F3 V' C' X
        if (t != "object" || obj === null) {
      Y3 a6 M* i1 U4 E& d; h        // simple data type! a0 a% D& `+ C( Y9 j5 ]1 ]
            if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
    ( P; }3 [6 f4 H  }$ a% u# F- P        return String(obj);
    ' `3 ]6 R7 G! i% D; B/ f    } else {
    & @1 o% A# S7 Z# l- `1 e- o) [        // recurse array or object
    , g) U4 X9 o5 Q% b% |        var n, v, json = [], arr = (obj && obj.constructor == Array);
    . U( H. C1 P9 G; C
    2 C/ t  K  T% x' M9 ]% U        // fix.
    6 g* ]& t$ {& {# \        var self = stringify;; ]2 _0 {! _& T& i  d9 S8 o

    - [9 [1 \7 ?: K* @        for (n in obj) {4 A& F% s8 J; K5 Y; U
                v = obj[n];
    , V& M. z. A. N6 d! Z7 W6 x0 c            t = typeof(v);
    ' E3 j3 ]: s- }            if (obj.hasOwnProperty(n)) {* k5 ^3 `: i% A3 L. |
                    if (t == "string") {8 w& C0 \% m& j1 G5 y/ Q
                        v = '"' + v + '"';
    + g# \) Y% R4 }                } else if (t == "object" && v !== null) {, E+ k7 `$ E& _) D% J: t
                        v = self(v);0 x% P: N( F8 J1 \+ Z2 W
                    }4 w. U' B2 l% d$ Q1 J
                    json.push((arr ? "" : '"' + n + '":') + String(v));6 b0 U1 g& K4 P) n2 D0 k) G
                }
    1 q7 K0 n, ?6 u/ L6 h- w1 t- p        }" ^- G" n* _! c/ `0 O' t( ~* z
            return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");! |, J4 i1 [4 M  A! h- C, z6 E# |
        }
    7 p, }1 y0 |7 {/ z  K3 }};
    / u& s* C4 l6 ?% ]* k
    7 y+ m8 A/ w8 Q; P3 q  ]
    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 05:20 , Processed in 0.414600 second(s), 49 queries .

    回顶部