”leetcode(1)-各种反转

Leetcode之反转

好了,从简单的开始嘛,那就从各种字符串的反转开始扒,反转呀反转转呀转呀爱的魔力转圈圈

第一道题[344. 反转字符串]

原题描述如下:

思路如下:

  1. 一开始最直接的想法就是直接 return s.reverse(); 哈哈哈然而如果面试的时候是不可能这样滴;
  2. 分析一下题目的关键字眼“原地修改输入数组”,不能申请额外的空间,只能在原数组上操作
  3. 接着题目的要求是反转,简单理解就是调个头,那么就是1跟n调换,2跟n-1调换…
  4. 就其实很容易想起递归,不断地把“第一个”元素跟“最后一个”元素进行交换,递归的边界是“尾巴”在“头”前面了就停止递归;
  5. 再另外一个点就是可以利用 ES6 的“变量的解构赋值”实现交换元素,就不用再申请一个临时变量;【等我哪一天来整理一下ES6的变量解构赋值。。】

源代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* @param {character[]} s
* @return {void} Do not return anything, modify s in-place instead.
*/
var reverseString = function(s) {
// return s.reverse();
swap(0,s.length-1,s)
return s;
};

function swap(start,end,s,){
if(start >= end){
return
}
// 交换元素
[s[start],s[end]]=[s[end],s[start]];

swap(start+1,end-1,s)
}

第二道题[557. 反转字符串中的单词 III]

原题描述如下:

思路如下:

  1. 首先呢,题目的参数是字符串,那么其实一般会考虑说把字符串转化成数组,因为数组原生的方法比较多,可以直接利用数组原生的方法(等我哪一天来整理一下…妈呀希望旗子不要倒)
  2. 那么由于在字符串中单词之间是以空格隔开的,因此可以利用string.split() 这个方法传入一个空格参数,然后根据空格把字符串中的单词作为数组的一个个元素;
  3. 好了,接下来就是将数组中的每个元素[元素是个单词哦]内部的顺序调换一下就好了,调换顺序可以想到reverse()嘛
  4. 对数组的元素进行遍历的话,就可以用最原生的for呀,当然最简洁的还是用map(注意注意又是一个考点了,map,filter和reduce的区别,这个我后期一定会整理出来的)

    总结:

    emmm我觉得这道理的思路真的是很简单,但是我觉得主要考察的点还是对于数组和字符串原生方法的熟悉度,其实这个也是蛮重要的,在一些主要考思维的算法题,能够利用好一些原生的方法能节约很大的力气,而且对于空间、时间等也是有一定优势的。所以个人感觉需要透过简单题目得到启发去更熟练一下原生的方法。

源代码如下:

1
2
3
4
5
6
7
8
9
10
11
/**
* @param {string} s
* @return {string}
*/
var reverseWords = function(s) {
let arr = s.split(" ");
let result = arr.map(item => {
return item.split("").reverse().join('')
})
return result.join(' ');
};

第三道题[7. 整数反转]

原题描述如下:

思路如下:

  1. 首先还是跟上一道题差不多,因为很简单,所以直接调用一些原生的方法就可以解决;
  2. 分为大的两种情况,超过32位的和没有超过的
  3. 主要是正常的没有超过32位的又可以分为>0,<0,还有=0;然后直接处理就好
  4. 但是我这道题跑了很多遍了还是没办法跑通所有的测试用例,卡在了32位上;还是蛮奇怪的,我还没找到原因(虽然我是用最粗暴地方法去判断2的32次方,但是也没毛病呀emmmm)

    总结:

    总的来说这道理的思路真的是很简单,同样我觉得主要考察的点还是对于数组和字符串原生方法的熟悉度,但是这道题有大数限制有边缘判断emmm是的我还不会,所以下面贴上的也是我跑不过100%的代码(后续我去找解决方法更新上)

    源代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
//求绝对值
// var t = Math.abs(x);
if(x> 2147483647){
return 0;
}

else if(x<-2147483648){
return 0;
}

else{

if(x > 0){
var a = x.toString().split("").reverse();
return Number(parseInt(a.join('')))
}else if(x < 0){
var x = -x;
var a = x.toString().split("").reverse();
var b = Number(parseInt(a.join('')))

return -b;
}else{
return 0;
}

}

};

第四道题[206. 反转链表]

这道题跟剑指offer有点点不一样,剑指的感觉比较简单一点,这个感觉有点麻烦,可以用递归和迭代,晚上也是先做了一点,但是emm今晚没时间整理了,我需要早点回去睡觉所以先放个图