数学建模社区-数学中国

标题: 递归 [打印本页]

作者: 美人如花    时间: 2015-4-15 09:52
标题: 递归
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)
# w( v$ ~  |; t# x算法:
+ r2 D, U4 z, W9 H# Q: N+ U! y; R# V   英文是单字节字符,中文是双字节字符,9 E/ {" Z* D: x9 w
   如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源* ~# a5 s9 M$ _$ z; A8 r

, N/ R! \0 Z" S8 Y# W" z! D! V7 i$ [   假设n个字符里面,有 k个英文单字,i个中文双字
6 R% b9 Q6 G* I+ f6 |0 V+ F   那么截取的时候只用考虑最右边的i个的字符
. S" O( v0 G% W2 ~' Y* s4 a- x/ N$ k' }7 g; ^9 b( K
   assume 左边都是英文单字的话,那右边的就全是中文;
, e4 J% S; A; d1 ~. ]   如果全是中文,那么有几个中文 就截取几个字符
9 u  I9 k" Z2 w9 Q# y1 s, d1 o' A+ v, y+ B. ?# Q
迭代的函数 输入应该是字符串,输出应该是左起的n个字符
$ v1 f/ f! {' q2 @迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)
" C' _' k( K& a+ h, D  b4 L/ P: o' h$ _# C2 I) I( L
迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
, c4 ~9 r! K+ w' H0 J6 W-------------------------------------------------------------------------------------------------------3 N$ Q! a; W7 @2 X9 I
if(!String.prototype.leftB){
6 s  T9 V3 J1 nString.prototype.leftB = function(n){ //n=7; U2 B* N; R0 B; g6 q7 Q# J. @
var s = this, //s="ilove我自己"4 p+ H8 }/ Y! `. q  i8 `+ P' D! Y
s2 = s.slice(0, n), //s2="ilove我自"
  D- \# ^  \$ f$ |4 C3 vi = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9; z, E: R( o' `5 j
if (i <= n) {   K' Y! L: j( y: b$ p
return s2; k
- x' ?5 G, O4 j) k! [}
- g: G; e" e( b- p0 V: u' Y/ U0 li -= s2.length;// i=9-7=2 , n =7,几个中文
! i( h" E5 W: Z& U% `9 rswitch (i) {
5 k- o4 Z/ A; D- B( R, W' }) ocase 0: return s2; //全是单字节; {- h' |+ y# q8 ]
case n: return s.slice(0, n >> 1); //全是双字节,比如中文
. D9 l" j8 B( W% _default: 7 p* }6 v& d& s9 D5 p: o" h
var k = n - i, //k=7-2=5,几个英文字
% p" H8 f) T. G: X1 Is3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
+ C3 J5 x7 h, k& |* ij = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数; x: M9 f3 O8 F4 N* P) @+ n
return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
1 P) @3 l1 [: V# e$ [; k} $ j* a/ e0 ^& L1 N3 O1 E1 Q
} , H% p6 H6 x" D, g6 [5 }8 x4 o
}6 _" H- ]* q4 r5 Z( h
-----------------------------------------------------------------------------------------------------------------3 r! D0 m$ T6 j- t3 k' @# t
var stringify = function (obj) {
. }' f! ]' Y* [+ u( N    var t = typeof (obj);
3 y3 o0 _: F4 @- A5 i3 r$ N1 ~" [4 ?    if (t != "object" || obj === null) {
0 E0 W6 C# V" ]7 W# ^        // simple data type  B+ ]6 O4 A6 X
        if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!7 @, F' j( E( c" a' S& x
        return String(obj);
1 b/ e! O5 W, e    } else {
8 l1 ^5 Q( t" J        // recurse array or object# I; Z& o4 F+ \1 i# s% ]* N
        var n, v, json = [], arr = (obj && obj.constructor == Array);
( L( X; w3 A( M! A! N. @& v0 x5 f' e" W5 K3 a
        // fix.( L6 [; _7 R; X5 N! s( Q
        var self = stringify;
( \. o* e. s9 w2 R2 w+ K( F
# F# U; R: s. w( b1 p; G        for (n in obj) {" I0 P9 q9 ]+ E
            v = obj[n];
; V# U6 ~1 X3 h# q$ H7 C3 g2 m            t = typeof(v);
& N, D$ p3 s. J  Y: x            if (obj.hasOwnProperty(n)) {( K, e( ~3 h* |4 k! S' V
                if (t == "string") {5 m" ?: U, Q! F3 p- a
                    v = '"' + v + '"';
" F: R1 f4 X$ M/ r. v1 J6 t# ?- n                } else if (t == "object" && v !== null) {4 Q& Q+ c% L9 b( r% o1 b
                    v = self(v);
0 t- M. ^/ I' D" O" ^; t                }" D" i) Z% }; U5 H1 ~% [
                json.push((arr ? "" : '"' + n + '":') + String(v));. ?$ \2 R5 y$ O: ?9 s
            }
5 s7 V$ q( o3 X6 }        }: \* T% p- a% q3 e& l' m# E6 @
        return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");+ A1 b: H0 D; f" j
    }
" f' u% L, Y$ B1 Z/ [; |};
9 U/ d$ Y5 H! o9 Q0 m$ Q" q# B7 M6 @1 _) q  ^





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