- 在线时间
- 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 e: _, E8 h& _, O4 ?) b算法:- Q* b( L/ u- }7 j0 _$ m, Z; ?4 d
英文是单字节字符,中文是双字节字符,
/ c/ V" W/ C3 c( z 如果要截取n个单字, 则先选取n个字符范围,用slice,这是数据源
1 d7 T* n6 @2 J4 w) t* u' F1 K! n# | d; v; K
假设n个字符里面,有 k个英文单字,i个中文双字9 [7 G" i# i% K R
那么截取的时候只用考虑最右边的i个的字符% T7 \" `% k$ M+ C
2 @; f7 I8 l2 `+ i/ E0 { assume 左边都是英文单字的话,那右边的就全是中文;
- l/ A8 G+ p! C6 ~ 如果全是中文,那么有几个中文 就截取几个字符, m5 E+ G/ f8 W+ e
8 L4 R7 u, D- n$ K+ u/ `
迭代的函数 输入应该是字符串,输出应该是左起的n个字符
7 X8 u8 u8 U; x. m& I; P& b迭代的最后最小单元应该是输入一个中文,和左起一个字符,但是返回空(这一个可以用slice(1>>1)右移来实现)/ \ q: b2 k& K/ z
- _# r3 ?% D9 g7 ~. a. o迭代的函数里面为了加速,应该优先考虑是否全是英文,全是中文的情况,这样就不用迭代,直接输出结果,还应该考虑最右边的字符如果都是英文也不用迭代了,只有右边的字符有中文的时候才用迭代( L3 E, h! c+ Q
-------------------------------------------------------------------------------------------------------
2 U& @4 Q4 I# rif(!String.prototype.leftB){ # n \ b( x; y% Y* c+ t
String.prototype.leftB = function(n){ //n=7
, a- L9 ]1 U, Z8 }8 ], w5 ]" gvar s = this, //s="ilove我自己"
$ D t* a" {$ ns2 = s.slice(0, n), //s2="ilove我自"2 H. i4 n& W1 b8 A. @6 a
i = s2.replace(/[^\x00-\xff]/g, "**").length; //i=9
; O9 W5 g; Q* r' Q S: I9 wif (i <= n) { & b) t! P* m$ l6 i8 _1 {
return s2; k
0 m( B7 _1 t- ~" P' g0 a} ; ~6 p) u/ t) H1 d: C# k" U% ~2 w
i -= s2.length;// i=9-7=2 , n =7,几个中文- Q: o# b! V# d( m. q
switch (i) { 8 V: K( I8 o- T- e
case 0: return s2; //全是单字节* Z1 q1 w/ h. Z' P! {: I0 f2 k
case n: return s.slice(0, n >> 1); //全是双字节,比如中文8 n4 ?& f4 a X3 H' m8 r
default:
8 @* H0 z. Y6 g) Z h. E; s2 hvar k = n - i, //k=7-2=5,几个英文字
7 I2 c- J4 Y! Z, G' c( Xs3 = s.slice(k, n), //s.slice(5, 7) s3=我自"$ O* N) a( L+ s/ Z9 C
j = s3.replace(/[\x00-\xff]/g, "").length; //如果中文在右边的话,这个算法就是最少复杂度的,判断s3里是否中英文字符,j中文字符数
4 o% ^, e# k# x. ~: R, \/ Rreturn j ? s.slice(0, k) + s3.leftB(j) : s.slice(0, k); //递归!!
# G+ W* Y2 I! P+ {}
9 T% l @" v4 ]2 } y% u; T9 V}
# J6 q- @+ i- X9 U# s3 S, M}
! ^9 ^4 K: {: ~3 T; q- G2 t# N-----------------------------------------------------------------------------------------------------------------7 J; Q# P; f/ [5 g0 E
var stringify = function (obj) {
7 g, m, {8 l- F. E$ X var t = typeof (obj);
0 x+ K! m) i) ] if (t != "object" || obj === null) {) S1 F: e4 b( v% K% W
// simple data type
: c1 K' N4 q/ ]* V5 u+ e0 y if (t == "string") obj = '"' + obj + '"'; //加引号的作用是,如果是字符串作为obj传进来,是没有双引号的,这时如果直接调用String(obj)只会输出obj ,没有引号!!!!!!!& U2 M. n, }8 o
return String(obj);; Q% I4 m' b5 s: _$ F& p3 l7 f0 e8 Q
} else {- \# S8 d8 R- @9 R( P. ^: {
// recurse array or object
* A4 \2 A8 M9 s5 u z/ b2 M var n, v, json = [], arr = (obj && obj.constructor == Array);2 n% W! ^! ~ l- w
" p/ O5 l) e1 p
// fix.
2 X$ V. M8 Q* u6 N9 z9 [ var self = stringify;
) s, f8 g, N" y! d/ k* u, t5 I3 S' H$ u( n6 [
for (n in obj) {, n/ Y* E1 o5 b p, }( A
v = obj[n];7 j, X' k9 m, h( s( x. m1 H; N. R
t = typeof(v);
7 F2 ]. e1 G; a3 m' | if (obj.hasOwnProperty(n)) {
1 l9 ]7 T; T7 b if (t == "string") {9 Q* q- i4 T# p! Z# O
v = '"' + v + '"'; ' |4 J* W( C+ U: o
} else if (t == "object" && v !== null) {
/ K+ h1 S6 X: h- V v = self(v);
7 s. b5 i/ t- R }
7 D% a( H$ e8 @ json.push((arr ? "" : '"' + n + '":') + String(v));8 H" m3 U# j9 P; Z$ F
}
$ F& f" O* ^3 z3 Y% X }& u9 _: M2 I0 R0 n+ P0 B& s
return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");# |" Z: |& g; E& ]& p
}% u+ B; q7 X- V) X
};8 j* G( @+ O* r! C( K+ l
4 S4 ^6 N0 a$ v `4 [ N4 C
|
zan
|