学习总结
1、今天复习了一些算法,关于字符串的。然后稍微做一下总结(10-21):
1、substr、substring、slice的区别
答:他们都是字符串截取子字符串的方法,但是都有一些不同的区别, 这三个方法括号里面都有两个参数
括号里的第一个参数都代表的字符串的初始位置
区别1:substr的第二个参数代表的是子字符串的截取个数和另外两个方法不同。
区别2:substring和slice的第二个参数都是字符串的结束位置,相同点就是都不会取到那个下标位置的字符,但区别就是substring不接受负值,有负值,就当做没看见忽略掉。如果这个负值在第二个参数位置,就会把前一个参数当做是结束下标。如果负值在第一个参数位置,就会忽略掉第一个参数,两个都是负值,就会一切都忽略掉。
2、做了一些关于字符串的题。以前用的答案稍微复杂,突然发现了更简便的方法,并且写了出来,再次感叹算法的精妙和脑容量的不足,居然没有在当时做题的时候想出这种解题的方法。下面把一些字符串的题目以及解题代码贴在下面
1.1:字符串首字母大写
// 首字母大写
var str="i love you very much"
var arr=str.split(" ")
for(var i=0;i<arr.length;i++){
// 错误
// arr[i][0]=arr[i][0].toUpperCase()+arr[i].slice(1)
// 这里无法进行赋值是因为arr[i]是一个字符串,字符串的单个字符无法改变
// arr[i][0].toUpperCase()
//这里就是字符串的一个拼接
arr[i]=arr[i][0].toUpperCase()+arr[i].slice(1)
}
console.log(arr.join(" "));
1.2:字符串首字母大写
先贴第一种,一般看不懂,也是字符串的一个拼接
function micrometer(n) {
var str = n.toString()
var str1 = ''
var n = 1
var len = str.length
for (var i = str.length - 1; i >= 0; i--) {
if (n % 3 == 0 && str[i - 1] != undefined) {
str = str.slice(0, i) + ',' + str.slice(i, str.length)
}
n++
}
return (str);
}
console.log(micrometer(66574));
console.log(micrometer(6689342))
console.log(micrometer(1234643245))
console.log(micrometer(66574));
console.log(micrometer(545676));
console.log(micrometer(332));
console.log(micrometer(3312));
第二种:这种更简单,将数字转为字符串,再通过split方法转换为数组,就可以使用数组的splice方法进行一个字符的插入,当然,和第一种方法一样,都是要通过向后遍历字符串进行插入的。然后为了避免数字不满三位或者刚好三位被插入字符的尴尬进行了一个判断,只要前面一个数组的元素不是undefined,那么才可以插入
function micrometer(n) {
var arr = n.toString().split("")
for (var i = arr.length - 3; i >= 0; i -= 3) {
if (arr[i - 1] != undefined) {
arr.splice(i, 0, ',')
}
}
console.log(arr.join(""));
}
micrometer(123456)
micrometer(12345678)
micrometer(123456789)
micrometer(1234567878)
micrometer(122)
var str="abcdefg"
console.log( str.substring(-5,-2));
1.3: 函数接收一个四位数参数n,将返回这个四位数收敛到6174的变化次数。
这个方法被我刚开始想的时候想的非常复杂,但是后来有了一个更简单的方法来实现让我真的感叹永远没有最简单的算法,人就应该不停的学习。
function kaprekar(n) {
var str = n.toString()
var arr = []
for (var i = 0; i < str.length; i++) {
arr.push(parseInt(str[i]))
}
arr.sort(
function (a, b) {
return a - b
}
)
var max = parseInt(arr.reverse().join(""))
var min = parseInt(arr.reverse().join(""))
c = max - min
for (var j = 1; j < 8; j++) {
if (c === 6174) {
return j
}
else {
str = c.toString()
arr = []
for (var i = 0; i < str.length; i++) {
arr.push(parseInt(str[i]))
}
arr.sort(
function (a, b) {
return a - b
}
)
var max = parseInt(arr.reverse().join(""))
var min = parseInt(arr.reverse().join(""))
c = Number((max - min).toString().padEnd(4,0))
console.log(c);
}
}
}
// console.log(kaprekar(1623))
// console.log(kaprekar(5679))
// console.log(kaprekar(3207))
console.log(kaprekar(7888))
··这是我使用的笨方法
2、其他
其实今天还完成了一个原型链的问题的深究,以及自己模拟map函数的一个实现,只能说,以前学习的还是太浅薄了,学习java的时候,真的没有去认真思考过那些继承的东西,今天模拟那个map函数实现的时候,着实是被那种原型链的查找,最后可以发展到查找object.protype的上面,以及函数的一个实参和形参相互传递达到函数的一个相互调用结果,确实觉得很感兴趣。蛮有意思的,或许对于实际开发并不是很重要,毕竟面向对象的问题已经被组件式开发解决,特别是前端开发已经是vue、react的天下,但再次深入一下底层原理,还是会觉得算法之美,犹如一种精神洗礼。现在每天都会觉得学习的时间太少,这种学习的劲头很少有了,希望继续努力,学到更多东西,明天就把东西总结出来。做好一个知识回顾,每次回顾也能发现一些问题。