QQ登录

只需要一步,快速开始

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

递归

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

14

主题

10

听众

43

积分

升级  40%

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

    [LV.3]偶尔看看II

    自我介绍
    跳转到指定楼层
    1#
    发表于 2015-4-15 09:52 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)+ s' R0 h: V5 K! E' n( t2 y2 S  S
    算法:
    + g" V. }. k3 z0 y# P   英文是单字节字符,中文是双字节字符," ]! ?! z# x- `$ k8 ?' q# b
       如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源! k: h* U( W7 r( U- D  ]# x
    5 \# y3 o; S; O) H* @4 ~" y, |$ O
       假设n个字符里面,有 k个英文单字,i个中文双字0 s# i; R% u" K; {" [& b
       那么截取的时候只用考虑最右边的i个的字符
    2 K8 a) x$ M: {) J  t# I! q$ T, v7 `( H% d" B9 j7 C9 }; U$ e
       assume 左边都是英文单字的话,那右边的就全是中文;- H3 |5 J" h' u
       如果全是中文,那么有几个中文 就截取几个字符
    % m8 Y3 U* V2 P1 P  h# ~& ^! T
    , {" ?$ K, I' [% |( q迭代的函数 输入应该是字符串,输出应该是左起的n个字符) R9 G! ~! d1 V+ i$ k' x; q9 ~; l
    迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)
    0 x) z9 m4 s: }" @# |+ `. ]! Q- b# ?6 i
    迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
    - O) Q- e/ ]2 n8 l; x& b5 ?% T-------------------------------------------------------------------------------------------------------
    # v. ~* O7 |& Q8 S7 |if(!String.prototype.leftB){
    7 e" c' R# M" H5 \" f# S/ _String.prototype.leftB = function(n){ //n=7- W& E! [# e2 G& z" z- x
    var s = this, //s="ilove我自己"/ D7 P; p$ i* w5 d8 {, g0 L3 D! B) W
    s2 = s.slice(0, n), //s2="ilove我自") k6 X9 |9 Z5 a9 U- Q3 T1 d
    i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9
    0 w7 j, K3 \- T) dif (i <= n) {
    / w1 B5 _) D3 G7 l/ }) Y$ h9 \  hreturn s2; k
    . x( ~* K) ]% Q# g, H- f} 1 g# x9 T; o3 B8 L0 U" ]
    i -= s2.length;// i=9-7=2 , n =7,几个中文
    & M  h1 ^1 N9 @$ |: t) M) |/ Nswitch (i) { 5 U3 a# U( w0 H6 e( Q
    case 0: return s2; //全是单字节
    9 }7 G0 c5 H  K8 ]" ?/ D0 Gcase n: return s.slice(0, n >> 1); //全是双字节,比如中文
    " n) x2 Y" V# p  _* [0 L$ Ndefault: 6 M9 Q6 W% ]; C6 N7 h+ s3 [
    var k = n - i, //k=7-2=5,几个英文字
    , T) \7 W! }5 b" o1 \! ps3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
    & C& W5 K% S- L  r. v  wj = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数, b2 E+ m9 K" i) I  S6 v: |# F
    return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
    0 q5 I, ~8 N2 D; t, ^9 L}
    , B  h6 a3 Y/ H6 h" L9 V; K} ( P0 _) U  q$ v, P
    }/ G" i- `. E8 m$ B% q
    -----------------------------------------------------------------------------------------------------------------# I( c4 K5 S" w* }! H
    var stringify = function (obj) {
    - R! c2 d- S6 j/ R: w6 }( W    var t = typeof (obj);$ Y  m/ Z' S* t* @# @& [- _& A
        if (t != "object" || obj === null) {: c$ U9 S- }* x( t
            // simple data type
    : v: `$ D3 U6 n2 v/ R% w        if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!7 L. @' T7 g* @- A3 ~4 W
            return String(obj);
    . n/ o$ R+ q. h) M* [    } else {
    * @- o6 u6 [& ]) O        // recurse array or object
    ! C; g5 r; j  F. r; o        var n, v, json = [], arr = (obj && obj.constructor == Array);
    : ^1 z* ]' i8 Y. |! b
    ) x4 W) i( O0 _        // fix.
    # \- e* a6 j5 H, }        var self = stringify;/ O* n! T/ @5 K; _* d  M6 G
      b' \: M3 u3 p6 q* `( _' w) ~
            for (n in obj) {
    ' u3 Y6 V& x7 t/ _2 j: P. X2 F5 ?, }            v = obj[n];
    ) ]# e  @/ }7 o; K% c1 x( {* q6 R            t = typeof(v);7 f3 j( Z. b/ |# `7 _0 `
                if (obj.hasOwnProperty(n)) {
    $ j, y9 S( G/ c* a7 q' u" c7 r2 X3 |& ]                if (t == "string") {, e* x. o- j  ^; L$ g
                        v = '"' + v + '"'; , ]0 ^; X# l' ?+ B+ N0 O4 U
                    } else if (t == "object" && v !== null) {% {8 @' ?) w& q) {
                        v = self(v);
    1 n" ^+ z7 S5 D' W                }
    $ g" {! J) p7 _) i                json.push((arr ? "" : '"' + n + '":') + String(v));9 ?4 B  n1 \0 }1 P( W  S* F
                }0 W1 Q+ }0 Z9 [3 Z: B* Y
            }
    4 e" Y0 l: \0 `# q        return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
    ( M0 w$ P" v9 C) y- I    }
    & I' v  \! n7 @+ p. p) R0 v};2 q$ J0 x! v/ I; x5 f/ m. J4 a+ W

    # u4 g" r# g" l4 c) D
    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-14 20:22 , Processed in 0.347700 second(s), 50 queries .

    回顶部