数学建模社区-数学中国
标题:
递归
[打印本页]
作者:
美人如花
时间:
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 f
if(!String.prototype.leftB){
) b8 A l" b; `7 u2 V
String.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! e
s2 = 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 ?" o
if (i <= n) {
1 u, `2 h% A7 I0 D
return 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+ C
j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
% Y w S( C' j# Z5 U6 M
return 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 E
7 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