数学建模社区-数学中国

标题: 递归 [打印本页]

作者: 美人如花    时间: 2015-4-15 09:52
标题: 递归
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)
1 ?* j8 W. m0 D  {% t算法:1 y3 U% v: M. s8 O9 r3 F
   英文是单字节字符,中文是双字节字符,. R! p  [- F" e0 X  \) B1 Y
   如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源* Q0 M7 L  R6 W6 a0 a8 {/ f

7 C2 N8 c$ `% ]$ m   假设n个字符里面,有 k个英文单字,i个中文双字
4 o9 K: f  f: ~" z   那么截取的时候只用考虑最右边的i个的字符. B3 p- t9 n0 D  O

& r% g' J0 {& q" u# ~5 n   assume 左边都是英文单字的话,那右边的就全是中文;# M/ e3 u" p/ e4 V) A' T. P
   如果全是中文,那么有几个中文 就截取几个字符  [5 d3 B9 \: I" L

) U; U2 E3 k0 Z! ^6 H迭代的函数 输入应该是字符串,输出应该是左起的n个字符) c. h& }: ^' Q5 G
迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现), |6 S0 F' V9 f+ R. e
# ?0 \1 p& j- J/ u  \0 W1 T4 p/ g
迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
! g- @, ?( A$ g' C( R; L9 }-------------------------------------------------------------------------------------------------------& f4 [) k, }! G$ A$ @3 J  g
if(!String.prototype.leftB){
$ J0 [  u2 C  E8 V& |String.prototype.leftB = function(n){ //n=7
2 u. w1 {( W/ P" }. h. ~var s = this, //s="ilove我自己"
& R# J( M2 u8 F! ~; U- ts2 = s.slice(0, n), //s2="ilove我自"
: [+ q3 k3 ^  W- S6 |i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9
( t2 o0 |, }( aif (i <= n) { 7 u# ~6 w8 a9 m6 o0 a% j" E3 |
return s2; k
) V( C" u# f. W3 ^9 G} ' ]% o7 W  c" S  x
i -= s2.length;// i=9-7=2 , n =7,几个中文; A# o- h4 _' W8 z0 i& `
switch (i) {
1 ^1 t# h6 a  }% S, g0 i4 l6 `0 rcase 0: return s2; //全是单字节
# D1 C* V% @0 U4 S3 q2 Pcase n: return s.slice(0, n >> 1); //全是双字节,比如中文
3 a0 Y, I& F9 ?+ Q: e& G/ vdefault: % |; K4 {3 \8 P
var k = n - i, //k=7-2=5,几个英文字$ l; @2 K7 B& i# S; l
s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"& V& v. }8 w# h" q% n
j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数6 Z/ ^4 t- y8 _" ^. Q
return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
# q6 K" s1 u0 R}
6 ]5 a+ }& P" h% s8 S}
$ A$ ~  n  V0 W9 x}
: l& D0 O# i: v0 |$ K* Z% r-----------------------------------------------------------------------------------------------------------------
8 k4 o7 I" y4 z/ j3 A* I4 [var stringify = function (obj) {
  f% u) b6 G- W+ _9 v' q6 s. \! g    var t = typeof (obj);2 N7 w3 L3 E" k* ~4 [, D  v' l  ^
    if (t != "object" || obj === null) {
8 ]; a0 p: V% {2 q7 K        // simple data type
" }' F% F* k2 S, y" \3 G        if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
+ C& B, C0 D  |        return String(obj);
. X: J) D3 I; B    } else {# [9 ~  x& p0 n/ Q( O
        // recurse array or object6 E% w& d+ @6 B
        var n, v, json = [], arr = (obj && obj.constructor == Array);
, W# r0 X; Q* M
: V" i  T3 J7 J; k+ X        // fix.
4 Y8 o) _% X. u/ N        var self = stringify;- G3 U+ K2 d) x) J
) [6 t, _2 A" T/ [
        for (n in obj) {3 G* ^+ G) |$ [6 m/ \- P
            v = obj[n];
0 e3 w3 h0 e$ t' I0 s            t = typeof(v);
- l- `: V# }  |$ z8 y* T            if (obj.hasOwnProperty(n)) {0 }" t1 T3 ^& H5 [
                if (t == "string") {
  q* X* k# f' G                    v = '"' + v + '"';
) V' S# f6 i: S/ I8 ?" C& G                } else if (t == "object" && v !== null) {' B! ?/ U' k) }6 V$ s4 L; ?
                    v = self(v);, b) G( u; x3 J0 B
                }  d6 F" Q3 S) C8 ]& }
                json.push((arr ? "" : '"' + n + '":') + String(v));9 D! L  P: }- [) ~
            }
# Z* m! |3 @8 P; n4 L  B% C        }
* e" E, Z) }' N0 o5 r1 Z" j        return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
, k4 }/ b0 o& z  r# ^    }# F! ^$ A$ D2 S1 [5 d! a$ l
};
. b% a! o# t& j
/ p0 R0 E' B- ?  p8 z




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5