- 在线时间
- 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
- 自我介绍
- 撒
 |
截取符串左起字符数(中文是双字节字符,要考虑单字节和双字节的情况)7 u+ o O$ T$ r% D+ z6 E5 }+ a ^8 d
算法:
$ g+ d" v! j+ Q( ?# L$ k' u0 ^ 英文是单字节字符,中文是双字节字符,( ]% H1 X- }0 @0 ?$ V
如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源7 ~/ F3 H- _$ _' w, J- Y. T: Y
( c3 Y8 J2 F% p% F- W7 s: f: N 假设n个字符里面,有 k个英文单字,i个中文双字
$ k+ \6 i( Y. E, x6 \ 那么截取的时候只用考虑最右边的i个的字符
( H |( {; C+ s3 `/ c% }# G7 D" K" U9 D$ F
assume 左边都是英文单字的话,那右边的就全是中文;* Q, E9 p4 X2 R' n% Y
如果全是中文,那么有几个中文 就截取几个字符
2 V t e/ a. m
/ {9 V2 }9 v5 Q- { |& G, Y! C迭代的函数 输入应该是字符串,输出应该是左起的n个字符( Q/ |. w4 v# ^: N, v- D4 t
迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)7 k! I& s! L% l- d1 V$ V0 J
1 C# [% e. q" A. `: R: f# K/ ~* j
迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代
, h' {1 m' j; [-------------------------------------------------------------------------------------------------------! Y3 q; w. `$ }& K a O
if(!String.prototype.leftB){ 5 v/ R4 r8 v; }1 I3 X4 u* Q
String.prototype.leftB = function(n){ //n=7
7 x7 A7 I2 o2 o8 b* R+ |1 q# ^var s = this, //s="ilove我自己"
4 ^, j3 _" x, d, A4 y# ~! V/ ~ Ms2 = s.slice(0, n), //s2="ilove我自"
5 h. y4 t6 Q6 N% u8 li = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9* |& c1 f6 t; Z; Q; H) T# b
if (i <= n) { . z( D/ F! \5 G, d- f* T W
return s2; k
1 u6 u7 e( L5 D5 [0 p6 k5 [, t9 z+ N+ U} 5 M6 }* m. ^ s" ?8 v0 Q
i -= s2.length;// i=9-7=2 , n =7,几个中文3 f3 Y: o( b" n5 E
switch (i) { / z d$ w" \1 i' l' G
case 0: return s2; //全是单字节
5 P# m2 r" u7 j) i) w' bcase n: return s.slice(0, n >> 1); //全是双字节,比如中文
" D5 Q1 Y8 B- d7 B4 S! gdefault: 2 I" I7 J, g- K0 n8 _; f, S" q
var k = n - i, //k=7-2=5,几个英文字
, \3 J5 n- H8 d' ~s3 = s.slice(k, n), //s.slice(5, 7) s3=我自"
0 V6 G9 s7 u: e( I& Jj = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
# O8 q2 X5 e+ k$ i+ {" oreturn j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!6 C# {' N1 X7 R- e' V C
}
$ t, _. f7 M! y5 O' |) L6 b4 J}
! k; \+ l! D; D8 L! |}. n, Y/ B& H' P- a9 t1 Q
-----------------------------------------------------------------------------------------------------------------. Z/ p" Y) L0 d* [* m
var stringify = function (obj) {: E$ _0 m; h5 y# H
var t = typeof (obj);$ T' k% ^' t9 R; R2 ~; c( T
if (t != "object" || obj === null) {
' w2 t# y, t4 q3 B. N' d# y- ~3 t2 w // simple data type
- R6 N7 ], Y+ g \4 y, T if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!% n2 w# _2 A& ?4 ]' ^5 S
return String(obj);
$ s# w) W0 x5 V9 @; u* k } else {2 v9 M+ X% _; l9 i- X
// recurse array or object
0 G% v: }( R6 }# [6 x var n, v, json = [], arr = (obj && obj.constructor == Array);9 l1 |) B8 n. L5 Z/ c$ E) w5 ]
& u2 Y2 Y) C1 G" m/ Y: E# l* q3 Y // fix.
# X+ k: t! L: _: g# L9 D: c var self = stringify;* A8 Q& R9 j' K" j
* P( i: \- |$ {& k( J4 v; `* p
for (n in obj) {5 _. c4 j( {5 `5 O. w4 R
v = obj[n];! O- M: C; c0 ?/ R
t = typeof(v);: H6 z3 h4 \! B b5 u2 I" l
if (obj.hasOwnProperty(n)) {
1 c2 F# J; N0 k. X7 r+ E6 u if (t == "string") {
0 _7 g: n9 ]! N( v# s5 g; e v = '"' + v + '"'; " C! h* E0 I8 {1 G# |* ^1 x
} else if (t == "object" && v !== null) {) C/ o( p0 M# i! |) C- A
v = self(v);, Y2 q1 Q: {) i$ o/ ?; n7 K- ^
}
3 J9 V! q5 n: D" U$ C5 X- n json.push((arr ? "" : '"' + n + '":') + String(v));
8 V" R; M f2 W/ n% p) l }
0 d# F! K( D. A2 L* w }
, F6 w& Q9 A7 e return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");$ D% j" i6 p' z; b) U+ I% S! w
}: n4 c% R! o2 ~! y3 ?7 C4 Y
};5 T+ C5 n0 I4 N4 k8 D! ^
$ x1 K6 h7 e* ~" `- ?% [ w; C
|
zan
|