- 在线时间
- 3 小时
- 最后登录
- 2015-5-5
- 注册时间
- 2015-4-8
- 听众数
- 10
- 收听数
- 0
- 能力
- 0 分
- 体力
- 92 点
- 威望
- 0 点
- 阅读权限
- 20
- 积分
- 43
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 26
- 主题
- 14
- 精华
- 0
- 分享
- 0
- 好友
- 7
升级   40% TA的每日心情 | 慵懒 2015-5-5 09:46 |
---|
签到天数: 10 天 [LV.3]偶尔看看II
- 自我介绍
- 撒
 |
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)4 } k% j5 d* z5 Q' _
算法: | H( q, y9 R2 t3 G$ ?, N" c
英文是单字节字符,中文是双字节字符,
& ?1 i. K8 m1 [) F 如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源- E2 E8 x6 n" p5 y: L
) g7 M: ]& U1 N& i 假设n个字符里面,有 k个英文单字,i个中文双字
3 c9 g+ |) Z. W$ B |* r$ D 那么截取的时候只用考虑最右边的i个的字符
9 Y& Q- g a/ g2 {8 [
& V1 Y4 Q6 }/ S/ j assume 左边都是英文单字的话,那右边的就全是中文;% H3 p+ Z4 m# H7 c
如果全是中文,那么有几个中文 就截取几个字符& a, \) c, K. T2 r, o, I4 e: j
% ^8 M5 I! d- ?. d+ c' Z7 D. |
迭代的函数 输入应该是字符串,输出应该是左起的n个字符
0 Y# b) \8 J0 P! W6 M, j8 r* D, g迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)
1 a$ X F( m6 T$ o/ w) B) h7 b b$ G! w5 H6 x! V; j! [
迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
6 j' A6 w( h% C, [' G2 |-------------------------------------------------------------------------------------------------------
4 H9 V( ?4 Q8 D- H' X3 _if(!String.prototype.leftB){ 0 y$ T6 R7 t9 b. I' N7 x
String.prototype.leftB = function(n){ //n=7
' V3 w! Z2 i; ~1 m8 i K1 h% {' F2 `var s = this, //s="ilove我自己"
* J8 P1 \9 M5 s/ r y+ C3 j5 @/ hs2 = s.slice(0, n), //s2="ilove我自"
4 j+ _3 p' q1 V, b/ j# V" q: [i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=95 w& j' O B5 g7 f9 U
if (i <= n) { ' v' e/ N/ o5 |- n$ m
return s2; k1 n* L9 r5 `4 N9 Y/ J! g; X: P; o
}
8 ^" G: h+ J+ x& }% U1 [' T9 E8 ai -= s2.length;// i=9-7=2 , n =7,几个中文2 H- \' P3 _5 a1 y* p
switch (i) {
% C6 G% N3 p3 p$ Jcase 0: return s2; //全是单字节/ {) i' _( A+ h- s8 p$ l# I, g# |
case n: return s.slice(0, n >> 1); //全是双字节,比如中文# F( j" J$ z' k m: n F3 s+ z
default: 5 j" }( l$ Y8 A1 o- C
var k = n - i, //k=7-2=5,几个英文字4 @0 T- M' w9 K5 P
s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"! U! y: R4 B/ m' ~0 e) [$ Q1 q
j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
8 b: f& C! Z& y# Z- t6 W) l* ^return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!. Z0 P: f+ q& a& u6 J p' O
} 4 J6 n7 l/ E7 j$ n& U; c6 }5 O! e
} 2 y! Y* c% v/ `) a* O. P2 |" V6 \) ^
}* t n3 E- ^1 Q" Z7 i
-----------------------------------------------------------------------------------------------------------------5 S. F7 y3 q: H+ Q
var stringify = function (obj) {( M5 r7 {3 b2 I* L' n( }: T
var t = typeof (obj);0 ?% R$ ~* f. J: X; L% \' t0 H
if (t != "object" || obj === null) {- m4 k( k6 J1 b+ g1 L( x( y8 ?4 w
// simple data type
+ P( o5 U3 D2 D6 q$ p) E4 E3 v' n$ S if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
" b, S2 F/ T) a+ p( H4 M return String(obj);
" a: F" i% m$ j f1 C- G+ S' A } else {" P" t! Y3 D2 I$ U2 L/ c7 W- ]7 H
// recurse array or object
0 h; j" D. `1 t var n, v, json = [], arr = (obj && obj.constructor == Array);
% Z! b( Q+ s( |5 p8 ?4 Y; e3 X$ W i. I5 b' T
// fix." n; K6 n9 V8 u0 T6 ?
var self = stringify;
$ G' `- G% J2 M c; Y* `% E' r' D7 [; V' H
for (n in obj) {, v3 {& X( `7 G# X0 C
v = obj[n];" [ F; ^' T: G0 [1 v
t = typeof(v);' m) `- m* b/ R
if (obj.hasOwnProperty(n)) {
2 r, ^* O5 [8 o8 J" W% z( |% W if (t == "string") {) n/ g' m- a6 s" B0 v
v = '"' + v + '"';
! Z: p4 ` ?1 N' U) e6 L- i+ Z } else if (t == "object" && v !== null) {
' t$ y2 c. ~, R3 s v = self(v);/ k: V: z0 f4 L0 f3 |
}
+ j! o. X+ h* [# d1 Q1 W: a json.push((arr ? "" : '"' + n + '":') + String(v));
& |5 M- I# K$ O% `. Y }% q8 U6 K0 j' O9 _
}4 F0 ]1 [( t# h! @* v
return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");- O; I' P0 U& h4 F/ S
}5 U! b9 M4 W7 A2 n% H; {3 x% \
};/ L2 L( h5 c2 j" e
4 z% a; |' p$ N( a6 }/ ]/ ]: h, D |
zan
|