NC78 反转链表
反转链表也是很常见的一道题, 也是牛客网上算法题目考察次数最多的, 有195次。
因为反转链表写过几次了, 也没什么好说的, 注意边界条件, 还有就是这次简化了一下代码。
简单 通过率:38.80% 时间限制:1秒 空间限制:64M 知识点:链表
描述
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围: 0≤n≤1000
要求:空间复杂度 O(1) ,时间复杂度 O(n) 。
如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
以上转换过程如下图所示:
示例
示例1
输入:
{1,2,3}
返回值:
{3,2,1}
示例2
输入:
{}
返回值:
{}
说明:
空链表则输出空
题解
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode ReverseList(ListNode head) {
ListNode n;
if(head == null || (n = head.next) == null){
return head;
}
//首节点的next记得置为null, 否则会形成闭环, 打印时进入死循环
head.next = null;
ListNode nn;
//这里其实是三个指针
while((nn = n.next) != null){
n.next = head;
head = n;
n = nn;
}
n.next = head;
return n;
}
}
NC140 排序
简单 通过率:42.14% 时间限制:1秒 空间限制:256M 知识点:排序
描述
给定一个长度为 n 的数组,请你编写一个函数,返回该数组按升序排序后的结果。
数据范围: 0≤n≤1×103, 数组中每个元素都满足 0≤val≤109
要求:时间复杂度O(n^2),空间复杂度 O(n)
进阶:时间复杂度 O(nlogn),空间复杂度 O(n)
注:本题数据范围允许绝大部分排序算法,请尝试多种排序算法的实现。
示例
示例1
输入:
[5,2,3,1,4]
返回值:
[1,2,3,4,5]
示例2
输入:
[5,1,6,2,5]
返回值:
[1,2,5,5,6]
题解
冒泡
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 将给定数组排序
* @param arr int整型一维数组 待排序的数组
* @return int整型一维数组
*/
public int[] MySort (int[] arr) {
// write code here
//冒泡
for(int i = 0; i < arr.length; i++){
for(int j = i+1; j< arr.length; j++){
if(arr[j]<arr[i]){
int tem = arr[i];
arr[i] = arr[j];
arr[j] = tem;
}
}
}
return arr;
}
}
选择
import java.util.*
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 将给定数组排序
* @param arr int整型一维数组 待排序的数组
* @return int整型一维数组
*/
public int[] MySort (int[] arr) {
// write code here
//选择
for(int i = 0; i < arr.length; i++){
int minIndex = i;
for(int j = i+1; j< arr.length; j++){
if(arr[j]<arr[minIndex]){
minIndex = j;
}
}
int tem = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = tem;
}
return arr;
}
}
插入
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 将给定数组排序
* @param arr int整型一维数组 待排序的数组
* @return int整型一维数组
*/
public int[] MySort (int[] arr) {
// write code here
//插入
for(int i = 0; i < arr.length-1; i++){
int j = i+1;
int tem = arr[j];
while(j>0 && tem<arr[j-1]){
arr[j] = arr[j---1];
//如果像下面这么写就会报错, 索引越界, 你知道为什么吗
//arr[j--] = arr[j-1];
}
arr[j] = tem;
}
return arr;
}
}