以下内容参考周雄老师的《JavaScript重难点实例精讲》这本书,可在微信读书上免费阅读,且这本书出版时间为2020年10月,内容较新,对小白友好,可供翻阅借鉴
字符串逆序输出
- 借助数组的reverse()函数
先转换成数组,再利用数组的reverse()函数,最后用join()拼接成字符串
function reverseString1(str) {
return str.split('').reverse().join('');
}
var str = 'abcgdsx';
console.log(reverseString1(str));
- 利用字符串本身的charAt()函数
注意charAt()函数的用法
function reverseString2(str) {
var result = '';
for (var i = str.length - 1; i >= 0; i--) {
result += str.charAt(i);
}
return result;
}
var str = 'abcgdsx';
console.log(reverseString2(str));
- 递归实现逆序(与2类似)
递归结束的标志是索引位置<0
function reverseString3(str, pos, strOut) {
if (pos < 0) {
return strOut;
}
strOut += str.charAt(pos--);
return reverseString3(str, pos, strOut);
}
var str = 'abcgdsx';
var result = '';
console.log(reverseString3(str, str.length - 1, result));
- 通过call函数来改变slice函数的执行主体
调用call()函数后,可以让字符串具有数组的特性
function reverseString4(str) {
var arr = Array.prototype.slice.call(str);
return arr.reverse().join('');
}
var str = 'abcgdsx';
console.log(reverseString4(str));
- 借助栈的先进后出原则
js未实现栈,所以首先要实现一个栈的数据结构
function Stack() {
this.data = [];
this.top = 0;
}
Stack.prototype = {
push: function push(element) {
this.data[this.top++] = element;
},
pop: function pop() {
return this.data[--this.top];
},
length: function () {
return this.top;
}
};
function reverseString5(str) {
var s = new Stack();
var arr = str.split('');
var result = '';
for (var i = 0; i < arr.length; i++) {
s.push(arr[i]);
}
for (var j = 0; j < arr.length; j++) {
result += s.pop(j);
}
return result;
}
var str = 'abcgdsx';
console.log(reverseString5(str));
统计字符串中出现次数最多的字符及出现的次数
- 通过key-value形式的对象存储字符串以及字符串出现的次数,然后逐个判断出现次数最大值
function getMaxCount(str) {
var json = {};
for (var i = 0; i < str.length; i++) {
if (!json[str.charAt(i)]) {
json[str.charAt(i)] = 1;
} else {
json[str.charAt(i)]++;
}
}
var maxCountChar = '';
var maxCount = 0;
for (var key in json) {
if (json[key] > maxCount) {
maxCount = json[key];
maxCountChar = key;
}
}
return maxCountChar + ':' + maxCount;
}
var str = 'aaabbbccccccccc';
console.log(getMaxCount(str));
- 借助key-value形式的对象来存储字符与字符出现的字数
通过split()函数传入待处理字符,可以得到一个数组,该数组长度减1即为该字符出现的次数
查看d的次数
var str = 'dhduhudfgjsb';
var number = str.split('d').length - 1;
console.log(number);
function getMaxCount2(str) {
var json = {};
var maxCount = 0;
var maxCountChar = '';
str.split('').forEach(function (item) {
if (!json.hasOwnProperty(item)) {
var number = str.split(item).length - 1;
if (number > maxCount) {
json[item] = number;
maxCount = number;
maxCountChar = item;
}
}
});
return maxCountChar + ':' + maxCount;
}
var str = 'djnidhsuhbcdwiu';
console.log(getMaxCount2(str));
- 对字符串进行排序,通过lastIndexOf()函数获取索引值,判断索引值的大小以获取出现的最大次数
function getMaxCount3(str) {
var maxCount = 0,
maxCountChar = '';
str = str.split('').sort().join('');
for (var i = 0; i < str.length; i++) {
var charCount = str.lastIndexOf(str[i]) - i + 1;
if (charCount > maxCount) {
maxCount = charCount;
maxCountChar = str[i];
}
i = str.lastIndexOf(str[i]);
}
return maxCountChar + ':' + maxCount;
}
var str = 'djnidhsuhbcdwiu';
console.log(getMaxCount3(str));
- 借助replace()函数
function getMaxCount4(str) {
var maxCount = 0,
maxCountChar = '';
while (str) {
var originCount = str.length;
var char = str[0];
var reg = new RegExp(char, 'g');
str = str.replace(reg, '');
var remainCount = str.length;
var charCount = originCount - remainCount;
if (charCount > maxCount) {
maxCount = charCount;
maxCountChar = char;
}
}
return maxCountChar + ':' + maxCount;
}
var str = 'djnidhsuhbcdwiu';
console.log(getMaxCount4(str));
去除字符串中重复的字符
- 使用key-value类型的对象存储
key表示唯一的字符,处理完后将所有的Key拼接在一起,可达到去重后的结果
function removeDuplicateChar1(str) {
var result = [];
var json = {};
for (var i = 0; i < str.length; i++) {
var char = str[i];
if (!json[char]) {
json[char] = true;
result.push(char);
}
}
return result.join('');
}
var str = 'djnidhsuhbcdwiu';
console.log(removeDuplicateChar1(str));
- 借助数组的filter()函数,在filter()函数中使用indexOf()函数判断
在自定义的filter()函数回调中,通过indexOf()函数判断其第一次出现的索引位置,如果与filter()函数中的index一样,则表示第一次出现,符合条件的则return出去
function removeDuplicateChar2(str) {
let result = Array.prototype.filter.call(str, function (char, index, arr) {
return arr.indexOf(char) === index;
});
return result.join('');
}
var str = 'djnidhsuhbcdwiu';
console.log(removeDuplicateChar2(str));
借助于ES6的语法,以上方法体的执行代码还可以简写成一行的形式
function removeDuplicateChar2(str) {
return Array.prototype.filter.call(str, (char, index, arr) => arr.indexOf(char) === index).join('');
}
- 借助ES6中的Set数据结构,Set具有自动去重的特性,可以直接将数组元素去重
function removeDuplicateChar3(str) {
let set = new Set(str.split(''));
return [...set].join('');
}
var str = 'djnidhsuhbcdwiu';
console.log(removeDuplicateChar3(str));
判断一个字符串是否为回文字符串
回文字符串是指一个字符串正序和倒序是相同的,不区分字符的大小写
- 将字符串按从前往后顺序的字符与按从后往前顺序的字符逐个进行比较,如果遇到不一样的值则直接返回“false”,否则返回"true"
function isPalindromicStr1(str) {
if (!str.length) {
return true;
}
str = str.toLowerCase().split('');
var start = 0,
end = str.length - 1;
while (start < end) {
if (str[start] === str[end]) {
start++;
end--;
} else {
return false;
}
}
return true;
}
var str1 = 'abcdcba'
console.log(isPalindromicStr1(str1));
- 与1类似,采用递归的形式实现
删除字符串首尾字符,进行递归处理
function isPalindromicStr2(str) {
if (!str.length) {
return true;
}
str = str.toLowerCase();
let end = str.length - 1;
if (str[0] !== str[end]) {
return false;
}
return isPalindromicStr2(str.slice(1, end));
}
var str1 = 'abcdcba'
console.log(isPalindromicStr2(str1));
- 将字符串进行逆序处理,然后与原来的字符串进行比较,相等则表示为回文字符串,否则不是
function isPalindromicStr3(str) {
str = str.toLowerCase();
var arr = str.split('');
var reverseStr = arr.reverse().join('');
return str === reverseStr;
}
var str1 = 'abcdcba'
console.log(isPalindromicStr3(str1));