数学建模社区-数学中国

标题: 递归 [打印本页]

作者: 美人如花    时间: 2015-4-15 09:52
标题: 递归
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)
$ w4 [, s- G. K- X6 O# T0 p' e算法:8 R. [# j  l0 ~
   英文是单字节字符,中文是双字节字符,0 n$ b. r" b0 z  Y
   如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源
' t' R, R, u  F$ B1 Q7 W' M6 e" E% Z3 v% r
. M  a0 s: `3 A8 p   假设n个字符里面,有 k个英文单字,i个中文双字' z% _  K0 ?3 `2 i' Y3 O$ n
   那么截取的时候只用考虑最右边的i个的字符
' x- p, j  c0 U( H+ T
& `* S3 x, T; w   assume 左边都是英文单字的话,那右边的就全是中文;  _' u( m; g& V0 p
   如果全是中文,那么有几个中文 就截取几个字符
9 E6 P" J3 {9 K- Q( W! _6 n$ Q( \& z7 c' J
迭代的函数 输入应该是字符串,输出应该是左起的n个字符
) M2 ~1 u- T( w' J7 |迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)
. @6 @. a2 [2 Z  C$ s" l
4 [6 N3 ^0 }/ r5 w( \4 p迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代5 U, z. Q5 ?; \' h
-------------------------------------------------------------------------------------------------------
( E, d2 s4 o2 B0 Q' h' }if(!String.prototype.leftB){ / l: v( G: V2 v/ I; s* G
String.prototype.leftB = function(n){ //n=72 u' T- n7 ?4 u1 C  R
var s = this, //s="ilove我自己"
$ I7 n( c; S' j% O8 |# r3 As2 = s.slice(0, n), //s2="ilove我自"$ ?% X& |" X5 f8 F3 g
i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9% U. ]- S2 C+ P, J  h$ r: Z8 U
if (i <= n) {
1 z" l% f+ f: h" B  Sreturn s2; k
7 x- S# P, `9 H} % B8 h5 L, X+ s; A
i -= s2.length;// i=9-7=2 , n =7,几个中文
# \! r" f8 C- a' Vswitch (i) {
9 V% `7 {6 ?: a# k* scase 0: return s2; //全是单字节0 @4 |: m) k8 w
case n: return s.slice(0, n >> 1); //全是双字节,比如中文4 L$ |6 x9 Y" N9 i7 d8 A9 X
default: " p8 L  V" I8 ^# T
var k = n - i, //k=7-2=5,几个英文字
6 z6 t1 w' }4 D3 xs3 = s.slice(k, n), //s.slice(5, 7) s3=我自"9 B& w3 m+ V) ^3 h7 S% \/ k$ w# M- ?6 v3 X
j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
7 Z$ u8 q0 m2 N% g5 q4 areturn j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!% c0 T  v. Z" A5 s% k+ c$ u
}
" ^1 f3 n; U% V} ; I7 o5 s3 H3 D1 W9 P% D
}
- x' k/ q$ s) t! Y" [( X-----------------------------------------------------------------------------------------------------------------
9 \& T7 ?' }* K- [var stringify = function (obj) {% [  b+ k: o! }0 [* s
    var t = typeof (obj);0 S) J5 b7 h+ s" i1 k
    if (t != "object" || obj === null) {( O* ~6 e/ p% T# \' m
        // simple data type
4 T5 p$ G$ G9 Y! s: r        if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
* _; O9 ?8 F8 L$ @6 U        return String(obj);: Q1 H. s& b4 e3 G! Z
    } else {
2 G! g: T: H7 s        // recurse array or object
. s; e' G. W! Y  r% d, {* Y" M        var n, v, json = [], arr = (obj && obj.constructor == Array);
( Z5 x6 Y$ l; C
5 z: i) S* d  ?, _& f+ ^        // fix.
! l: X4 r) t0 c! |! B/ U        var self = stringify;
9 W$ o  v: Z2 K: S5 H2 i. l: l4 w4 q
0 R5 ^5 p- M0 ]& \0 p        for (n in obj) {( ]" q+ P9 T0 x$ |# V
            v = obj[n];1 P) f4 s+ r5 y( n+ p! Z5 k/ `, {
            t = typeof(v);
( i1 g( l$ l" Z$ _! `& {            if (obj.hasOwnProperty(n)) {- Q- N* e2 _$ H7 o# Z
                if (t == "string") {
  l, r+ S% }1 n: A" X- N6 |; Z                    v = '"' + v + '"';
" t2 C2 I4 U4 T8 d- J% x7 C2 C                } else if (t == "object" && v !== null) {1 T( _# I4 u8 Z7 Y7 t! j
                    v = self(v);
2 ?# v& D9 q3 f6 \" a; }                }/ Q5 B3 \$ V* h' V
                json.push((arr ? "" : '"' + n + '":') + String(v));
4 ~( k$ @$ Z3 |4 f            }, ^  Q% \9 C. X9 U) i
        }$ Y( i. M+ J" u4 }1 m
        return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
+ \) D0 W4 W" S5 z    }; D' T. T0 G; \) \
};1 J1 X8 U  n8 v' w: T9 m. l

2 O! @7 U: y, ~3 w6 K3 w




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