数学建模社区-数学中国

标题: 递归 [打印本页]

作者: 美人如花    时间: 2015-4-15 09:52
标题: 递归
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)
, n& R! G; S/ n' U  c: w* Q) ?1 O算法:) |- `8 v* e2 j* V- R6 D0 {
   英文是单字节字符,中文是双字节字符,5 `2 C+ z2 T* a' e; V/ T
   如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源
5 Y% b/ ]) F3 P0 L
1 [/ \4 b" B% Z; N0 {   假设n个字符里面,有 k个英文单字,i个中文双字
0 q2 ~+ c* j8 ~" Z. O5 d  X   那么截取的时候只用考虑最右边的i个的字符3 K# g4 M( N  _( Q! g* r0 g8 R
: S5 d! h; J, {: S$ t
   assume 左边都是英文单字的话,那右边的就全是中文;/ C  J1 O$ |+ @1 |( M% v
   如果全是中文,那么有几个中文 就截取几个字符
% r9 Z0 D0 V9 m( n+ L' s
! C9 F$ X# t  c2 r迭代的函数 输入应该是字符串,输出应该是左起的n个字符/ |+ Y/ f9 b9 I! z: l
迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)# ~" D+ Q# m1 C
1 }: |  ]# H* v' @' _/ g
迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
# s2 s+ x6 |# J0 h-------------------------------------------------------------------------------------------------------
7 W/ t/ a2 ]% D- e) t* [/ ?3 fif(!String.prototype.leftB){
) b8 A  l" b; `7 u2 VString.prototype.leftB = function(n){ //n=7) S" j/ _9 b( F4 D; _$ Q( c
var s = this, //s="ilove我自己"
2 t+ p- s! x  U. g! es2 = s.slice(0, n), //s2="ilove我自", I# _4 S# W5 h* J8 ^
i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9
4 D' B: c( \- q5 ?" oif (i <= n) {
1 u, `2 h% A7 I0 Dreturn s2; k  Y' x8 x2 t. L3 n
} 3 v, N2 `7 B  r# k! }! h
i -= s2.length;// i=9-7=2 , n =7,几个中文) }& c( @  E1 \! }7 r* O5 a0 _9 u
switch (i) { ' G, p$ n) c/ z( X/ ^9 D- {7 r
case 0: return s2; //全是单字节7 z0 ]4 F, W! ^" ~& t
case n: return s.slice(0, n >> 1); //全是双字节,比如中文
5 R; H2 \+ \) g* y# {$ \default: $ g1 N5 F4 [2 a, i# ^& d
var k = n - i, //k=7-2=5,几个英文字
& c) C3 U% U7 ]s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
& A1 B7 ]! X. D7 E# y, i+ Cj = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
% Y  w  S( C' j# Z5 U6 Mreturn j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!1 J! m! H- Z4 i) \6 P+ U7 [; A
}
5 [& ], W7 c! T  G- e5 R} - {! k$ b, ~1 ]5 y3 P6 ]% m4 a
}
" L* }' v7 `% C- F- h; R- K, d-----------------------------------------------------------------------------------------------------------------$ {& f" l7 n3 V. T
var stringify = function (obj) {
9 O; B0 K4 \$ e$ s, l    var t = typeof (obj);* O' }. h1 A7 v: ]  r* z+ `3 i
    if (t != "object" || obj === null) {% E" F$ ^( ^; f$ a0 t/ B8 }8 ~6 K
        // simple data type
7 _8 z$ `3 q) U. `. m4 i8 m        if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
' d  t8 }- u& `6 \. _        return String(obj);
+ v$ H% L$ k6 z$ O% ]    } else {
; s' x& G( h; i5 L. F6 l        // recurse array or object$ ~: G# N) i! r: Q) y' X
        var n, v, json = [], arr = (obj && obj.constructor == Array);6 E$ z4 e7 j' c, `( E# I8 L
! ]) }+ f) K9 M) ~! R- z, ?9 N
        // fix.
: Z: y* `* x* G7 Q        var self = stringify;
. p8 S2 W* [9 X: a4 a5 E7 h. k( F  W- j" ?2 p9 ]/ Q
        for (n in obj) {
+ V* l0 r/ j/ A/ N/ A3 j            v = obj[n];
5 t' p4 _* N. T+ _6 n$ A            t = typeof(v);
, f6 d9 W# P5 ^& R            if (obj.hasOwnProperty(n)) {
) P# C. x. P7 W, f) Q                if (t == "string") {* Q# O$ P2 ?- B, s' {$ m2 @# P/ t7 `
                    v = '"' + v + '"';   V( R+ Y" m4 g- m
                } else if (t == "object" && v !== null) {$ u9 `  M2 e  R2 K
                    v = self(v);$ L, k" I% }+ R# z3 P6 U
                }) N9 B. I( F  v0 \' @
                json.push((arr ? "" : '"' + n + '":') + String(v));
' w  W2 m. a3 c- O; h9 s0 @            }, V8 N; m1 C9 t. Z
        }
$ w) L4 g9 K; y# b, a; B2 M1 @        return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
7 |2 d0 c, ?1 t6 @0 m$ r    }
3 [+ m2 ]: h, i# S};
. w5 {* [& I0 n/ f1 K) u
, Z) I* B# r, J& m# w




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