1、截取子串:字符串中含有汉字(作为2个字节),实现一个函数subStr(str, len),假设str为‘我ABC汗DEF’,当len为4时应输出‘我AB’,当len为6时输出‘我ABC’
代码实现如下:
function subStr (str, len) {
if (Object.prototype.toString.call(str) !== '[object String]' || Object.prototype.toString.call(len) !== '[object Number]') {
return false;
}
if (len === 0) {
return '';
}
if (len >= str.length) {
return str;
}
var j = 0,
res = [],
re = /[^\u4E00-\u9FA5]/;
for (var i=0; i<len; i++) {
if (j < len) {
if (re.test(str[i])) {
res.push(str[i]);
j++
} else {
if (j+2 > len) { // 如果是汉字判断加上其长度是否超过len,超过则舍弃该汉字
break;
}
res.push(str[i]);
j += 2;
}
} else {
break;
}
}
return res.join('');
}
var str = '我ABC汗DEF';
console.log(subStr(str, 4)); // 我AB
console.log(subStr(str, 6)); // 我ABC
console.log(subStr(str, 0)); // ''
console.log(subStr(str, 15)); // 我ABC汗DEF
2、不使用数组的push和pop操作实现一个栈,具有属性length和方法push()和pop()
需要注意进行非法输入检测和边界条件进行判断,代码实现如下:
function Stack () {
this.data = [];
this.length = 0;
this.push = pushStack;
this.pop = popStack;
}
function pushStack (element) {
this.data[this.length++] = element;
}
function popStack () {
if (this.length === 0) {
return new Error('void Stack');
} else {
let tmp = this.data[this.length - 1];
this.data = this.data.slice(0, --this.length);
// console.log(this.data);
return tmp;
}
}
var arr = new Stack();
console.log(arr.length); // 0
arr.push(1);
console.log(arr.length); // 1
arr.push(2);
console.log(arr.length); // 2
arr.push(3);
console.log(arr.length); // 3
arr.pop();
console.log(arr.length); // 2
arr.pop();
console.log(arr.length); // 1
arr.pop();
console.log(arr.length); // 0
arr.pop(); // Error