数学建模社区-数学中国

标题: 递归 [打印本页]

作者: 美人如花    时间: 2015-4-15 09:52
标题: 递归
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)7 _  F2 k, {: M( e
算法:
+ [4 S9 o7 h4 {+ O5 j8 [   英文是单字节字符,中文是双字节字符,
. j$ z- \% O% |! |   如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源
; Z* j. u/ k2 P* C2 S* y  @+ w6 G0 Y  Q- J. W
   假设n个字符里面,有 k个英文单字,i个中文双字6 x8 p# U( B1 z5 M
   那么截取的时候只用考虑最右边的i个的字符
8 J* V, t7 l0 i( m7 z: s
  O7 Z! }  `  L   assume 左边都是英文单字的话,那右边的就全是中文;
/ r% j; `+ C& K' D0 U) |/ z$ {   如果全是中文,那么有几个中文 就截取几个字符. U6 {6 P( ]$ d3 M9 W: w

8 F% N/ N  E% E) S迭代的函数 输入应该是字符串,输出应该是左起的n个字符
# S) _! _/ A  d+ y/ y: {1 j  ~3 o3 p迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)
7 Q( A$ C+ |! ^
% a, [. P+ @5 U' Q1 P迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代2 _5 |! R* r' E- o$ [
-------------------------------------------------------------------------------------------------------
+ o: F- H% G9 y  tif(!String.prototype.leftB){ & d6 K1 e% A; p. B
String.prototype.leftB = function(n){ //n=7
6 a  o- D1 l2 _- Y8 M2 x5 b2 Cvar s = this, //s="ilove我自己"( }5 S$ L( Z2 Q* _3 C* w, }1 i
s2 = s.slice(0, n), //s2="ilove我自"% k" Y. e. I8 H
i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9
! M+ p. u0 x0 m! Kif (i <= n) { 1 O* p" x. f- y# V! i6 ^9 ^
return s2; k
% N& u$ R# m$ L: U} 8 w! K& J% C! L
i -= s2.length;// i=9-7=2 , n =7,几个中文
' I6 n, g' H" n8 r3 jswitch (i) {
3 p$ E; e: u$ T, m9 P, _# p) H5 k( k* q  Ucase 0: return s2; //全是单字节2 O7 y8 |% L& |: d2 P/ Q  p
case n: return s.slice(0, n >> 1); //全是双字节,比如中文
2 j+ J( M% T1 F" ?4 gdefault:
& e. Q# D1 s! @& E  ^: @var k = n - i, //k=7-2=5,几个英文字
+ G7 f/ {6 K+ ^, ks3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
' O2 v1 `$ E: i( A. mj = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
0 f, q+ G  l- T' lreturn j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
  J2 n1 E* u" p( K7 u8 g6 S}
% p3 C2 V. T% q" z8 l6 }2 d} $ @# s% r4 J; W) j
}
( x4 P4 R) e9 v5 l-----------------------------------------------------------------------------------------------------------------
% ^: D( e3 ^; |  v) j+ P& s& p8 Gvar stringify = function (obj) {4 k* c/ @* {4 `) P1 e+ J
    var t = typeof (obj);
1 C0 k) ^! m+ O( r; I    if (t != "object" || obj === null) {: |! }+ Q$ A* }  q. z7 p) u
        // simple data type
0 O$ O+ B% x$ |/ W" u  q+ c* g2 @        if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!: @) T6 e; v' n; o# S1 p0 q& l& A
        return String(obj);- O4 q* ~6 O& U3 N: p- U7 V
    } else {4 R1 |. D6 |1 s! p7 Y% Z4 a8 _
        // recurse array or object9 f1 j4 [3 F: E6 ?
        var n, v, json = [], arr = (obj && obj.constructor == Array);' q. E8 D$ ~# y( T# R* i7 }

( A* Q/ W. [7 k5 r$ w% M: A, V, L  w        // fix.4 ]2 C% d9 r! h6 w7 y/ N
        var self = stringify;
6 |( a9 G0 M/ i$ D% M6 @1 [8 p) r4 H6 B
        for (n in obj) {
  l, {: v# q7 [* [            v = obj[n];+ v8 i0 ~# w3 {; y: s1 g
            t = typeof(v);
$ P3 m7 w# R! g; c            if (obj.hasOwnProperty(n)) {; N' t. E" l0 K* `  ?3 w7 O
                if (t == "string") {$ z' n# f5 y- b- b
                    v = '"' + v + '"';
0 o2 W4 g. S" T# v4 [  ?                } else if (t == "object" && v !== null) {
5 a0 W& x3 L% T4 q& c                    v = self(v);7 d2 u( a  J/ V0 M1 X
                }' `# T+ }' i/ b5 B* l3 }$ V$ s
                json.push((arr ? "" : '"' + n + '":') + String(v));- W$ m8 R: t5 D1 L2 e
            }% c( k5 k: H  [1 O2 k
        }
( M0 l% F' c8 m" I+ V  f        return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
% E- j% h  ]3 Y7 z. A    }" W/ V& A8 u4 f2 e5 e" m. o+ w" u
};( F/ F) e- M) e5 n, T) }  R' g

& ~+ f5 {3 U/ V8 q' ]




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