数学建模社区-数学中国
标题:
递归
[打印本页]
作者:
美人如花
时间:
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# y
1 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 n
String.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 v
i = 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 l
i -= s2.length;// i=9-7=2 , n =7,几个中文
! i( h" E5 W: Z& U% `9 r
switch (i) {
5 k- o4 Z/ A; D- B( R, W' }) o
case 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 I
s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
+ C3 J5 x7 h, k& |* i
j = 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 Q
0 m$ Q" q# B7 M6 @1 _) q ^
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5