1.有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100] 排序后,数组变为 [0,1,9,16,100]
示例 2:
输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums
已按 非递减顺序 排序
进阶:
- 请你设计时间复杂度为
O(n)
的算法解决本问题
解题思路:根据题目意思写代码就好了
以下分享两种写法
var sortedSquares = function(nums) {
// nums.forEach((item,index) => nums[index] = item * item)
// nums.sort((a,b) => a-b)
for(let i = 0; i < nums.length; i++){
nums[i] = nums[i] * nums[i]
}
for(let i = 0; i < nums.length - 1; i++){
for(let j = 0; j < nums.length - i - 1; j++){
if(nums[j] > nums[j + 1]){
const temp = nums[j+1]
nums[j+1] = nums[j]
nums[j] = temp
}
}
}
return nums
};
2. 移动零
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12] 输出: [1,3,12,0,0]
示例 2:
输入: nums = [0] 输出: [0]
提示:
1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1
解题思路:
定义两根指针指向数组的开头
遍历数组判断右指针的数是否为0,如果不是就跟左指针的数交换 并且左指针右移一个步长
每次遍历右指针步长都+1,遍历完的数组就是答案
var moveZeros = function (nums) {
let left = 0,right = 0
for(let i = 0; i < nums.length; i++){
if(nums[right] !== 0){
const temp = nums[right]
nums[right] = nums[left]
nums[left] = temp
left++
}
right++
}
return nums
}
3.链表的中间结点
给你单链表的头结点 head
,请你找出并返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
示例 1:
输入:head = [1,2,3,4,5] 输出:[3,4,5] 解释:链表只有一个中间结点,值为 3 。
示例 2:
输入:head = [1,2,3,4,5,6] 输出:[4,5,6] 解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。
提示:
- 链表的结点数范围是
[1, 100]
1 <= Node.val <= 100
解题思路:使用都指向头节点的快慢指针,slow步长为1,fast步长为2,当fast,以及fast指向的下一个节点不为空两根指针才移动,直到不能移动slow所指向的就是中间节点
var middNode = function(head){
let slow = fast = head
while(fast && fast.next){
slow = slow.next
fast = fast.next.next
}
return slow
}
4.删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
示例 1:
输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1 输出:[]
示例 3:
输入:head = [1,2], n = 1 输出:[1]
解题思路: 创建一个虚拟节点指向头节点,定义两根指针(slow,fast)指向这个虚拟节点,先让fast移动n次,如果fast的下一个节点还存在就让两根指针都移动,直到fast下一个节点不存在。此时删除slow所指向的节点(建议画图描述该过程)
var removeNthFromEnd = function(head,n){
let dummy = new ListNode()
dummy.next = head
let slow = dummy
let fast = dummy
for(let i = 0; i < n; i++){
fast = fast.next
}
while(fast.next !== null){
slow = slow.next
fast = fast.next
}
//删除节点
slow.next = slow.next.next
return dummy.next
}
来源:力扣官网