数学建模社区-数学中国
标题:
递归
[打印本页]
作者:
美人如花
时间:
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=7
2 u' T- n7 ?4 u1 C R
var s = this, //s="ilove我自己"
$ I7 n( c; S' j% O8 |# r3 A
s2 = 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 S
return 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' V
switch (i) {
9 V% `7 {6 ?: a# k* s
case 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 x
s3 = 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 a
return 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