- 在线时间
- 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 L1 C# t- i& W1 W2 r算法:
. m* o$ |+ B) \. Q, X. l 英文是单字节字符,中文是双字节字符,
6 [2 Q- N% k$ @' l" w7 l 如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源% @- C w D! d* F7 u l- i: ^
6 g3 O2 z1 q& X: x! |# j
假设n个字符里面,有 k个英文单字,i个中文双字( w( \! Y8 m9 @ Q" [$ ]
那么截取的时候只用考虑最右边的i个的字符, n; [% ^3 V4 @0 d5 @$ K
- n w8 b% t( _1 T+ z assume 左边都是英文单字的话,那右边的就全是中文;
8 Q; f0 Y; @! c D$ C7 P1 Z 如果全是中文,那么有几个中文 就截取几个字符
+ i* ]7 E5 p/ _
' Q5 p- |' }* K- w& n% B% W5 X迭代的函数 输入应该是字符串,输出应该是左起的n个字符
, _3 I1 b( o# k: ]" |, u. B迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)5 c( s2 Z6 B! p' N' R' `
# ?. N0 z7 q- t# i8 s
迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代3 w' q" U/ z$ v: S; g; i
-------------------------------------------------------------------------------------------------------
; H8 e, a9 |9 H& Q ]if(!String.prototype.leftB){
6 }, |$ @/ i) t. E4 l4 o) IString.prototype.leftB = function(n){ //n=70 P' v0 b: c: p( [( l
var s = this, //s="ilove我自己"# g( k8 V, M6 D* {3 N% c3 \
s2 = s.slice(0, n), //s2="ilove我自"! Y7 j* v; ]4 h3 V, F* e
i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9# p2 t# a. I/ P0 w6 o( w/ O
if (i <= n) {
: a' z& p+ A2 x! E {- v- p; freturn s2; k |* M/ R) m7 f9 W0 J" K3 z
}
/ b9 \2 z6 Y N9 wi -= s2.length;// i=9-7=2 , n =7,几个中文
! d6 I* }8 V6 \/ B. yswitch (i) {
5 z# H1 @8 ^% Zcase 0: return s2; //全是单字节5 `7 r. E9 C: D& k" h) N
case n: return s.slice(0, n >> 1); //全是双字节,比如中文
) h# Q( j2 I, qdefault:
9 z! F& `' E- m# q: ?var k = n - i, //k=7-2=5,几个英文字4 U U7 R3 G( s$ E8 u- j" O8 L
s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
" `& ^" d6 b, }+ z% ?& D' h# o5 jj = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数1 @5 |5 F3 n3 y6 x9 f2 ~% f- U1 t
return j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!8 o* K9 |3 T1 B* y4 z- I' p
}
5 l" R) V; E% u! X9 Q0 r}
O) m' b: _0 G}- |2 B7 P) r) F! k, S
-----------------------------------------------------------------------------------------------------------------
' Z( d9 f2 y' O3 X( f2 S8 fvar stringify = function (obj) {
8 | j/ I6 i( V* g% M2 q9 b5 n6 P7 @; o7 p* ] var t = typeof (obj);
+ C o( A) Q7 E2 ^. `, t2 U8 A if (t != "object" || obj === null) {# ^" N r; x/ J$ k% u) q' J
// simple data type
9 B) a5 H4 y" ?7 I$ {3 Z if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!
8 Z* P6 F+ H: S/ Q. S" N# E return String(obj); w* [# d3 P" o+ @ \% i/ f
} else {$ D/ n3 F; x9 l: \* i( K
// recurse array or object
2 y- b) _* L H2 {* f var n, v, json = [], arr = (obj && obj.constructor == Array);
% O7 J" I- B# r( k* [
) V0 w5 ?; v- j+ K1 F; ]0 y/ I // fix.
4 o( L; a4 a+ }+ t var self = stringify;
5 L" v W( E1 Y& _
' F% X/ w" h0 |$ Y3 f) K% Q2 o8 Z for (n in obj) {
! m0 T; p; ~1 w8 m v = obj[n];
0 ]$ @- ^1 s: Q( S t = typeof(v);" _% N. v5 ^3 V) A8 ~9 b
if (obj.hasOwnProperty(n)) {
$ p3 a4 O9 ^! m6 E" W' _' q if (t == "string") {
# c9 C% g. ^6 e+ G4 x v = '"' + v + '"';
) b5 c1 o7 l( l0 j0 z' ~ } else if (t == "object" && v !== null) {
6 Y' g c7 h2 H1 ]/ K9 n1 I& ~ v = self(v);/ G( @7 U6 G8 }6 k
}/ i6 s# C$ z8 Q- ?5 M
json.push((arr ? "" : '"' + n + '":') + String(v));! F* t4 a! F7 s B. z
}" c, ?0 I* m0 I* E8 N+ p% T1 e4 Z
}
5 M- | A2 s) ^! H+ X* z1 [ return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");4 g( x8 t! b6 z% }5 A+ T
}+ L) k) i6 S, Z h+ W
};* `$ q6 _- y ] W' c# Y. ~& f
/ s ]( h l4 }2 Q
|
zan
|