LeetCode0024

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例:

给定 1->2->3->4,你应该返回 2->1->4->3.

/**
* @param {ListNode} head
* @return {ListNode}
*/
var swapPairs = function (head) {
let dummy = new ListNode();
dummy.next = head;
let parent = dummy;
while (head) {
let next = head.next;
if (!next) break;
let next2 = next.next;
//交换了节点
next.next = head;
head.next = next2;
parent.next = next;
//重新制定head和parent,注意是两两交换而不是挨个交换
parent = head;
head = next2;
} return dummy.next;
};

结果:

执行用时 :60 ms, 在所有 JavaScript 提交中击败了87.62%的用户

内存消耗 :33.9 MB, 在所有 JavaScript 提交中击败了11.69%的用户

LeetCode0025

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例 :

给定这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

说明 :

  • 你的算法只能使用常数的额外空间。
  • 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

空间复杂度,顾名思义,就是你的程序要用多少个内存空间。但这并不是一个具体的数字,因为谁也不知道你的程序真正会具体用到多少字节,所以这只是一个大概的评价算法的一个概念。

无论你的程序是用1字节内存还是1亿字节内存,只要这个数字是确定的,你都可以说你的程序的空间复杂度是O(1),这代表你要使用的空间一个常数,而不是特指1,常数代表所需的空间在程序运行中不会改变。

但是如果你的程序是输入n个数据并且分配n个空间,那么空间复杂度就是O(n),因为这个n我们不知道程序在真正运行中到底输入多少数据,你输入10个也行,输入100亿个也行,因为我们不知道所以动态的说是要用到n个空间,就算输入n个数据,每个数据要用到1000个字节内存,我们也只说空间复杂度是O(n),因为1000是一个固定的数字,或者说常数,这个常数不会随输入数据量n的变化而变化,我们只关注动态的会变的那个n而已。(我们有时候也在这种情况下说复杂度是O(n*c),就是大O,n乘以c,c代表的是一个常数,在这个例子中就是1000,不过一般情况下不这么说,因为和不会变的常数c相比n往往大得多的多,所以我们一般简写O(n)而已)

如果需要输入n个数据,每个数据因为需要和其他n个数据联系,所以要分配n*n个空间,或者说n的平方的空间,我们就说O(n*n),或者说O(n^2)(指n的2次幂)个空间复杂度,这也是因为n是未知的。

思路:

  • 说到倒序很容易就想到栈了,我先push进K个listNode,满足k个就往外pop并且连接起来;
  • 不够K个就直接组合输出。
  • 先试试算不算满足常数的额外空间,LeetCode应该会有空间复杂度的验证;
/**
* @param {ListNode} head
* @param {number} k
* @return {ListNode}
*/
var reverseKGroup = function (head, k) {
let dummy = new ListNode();
let result = dummy;
let stack = [];
let count = 0;
while (head) {
stack.push(head);
head = head.next;
count++;
if (count === k) {
while (count > 0) {
dummy.next = stack.pop();
dummy = dummy.next;
dummy.next = null;
count--;
}
}
} if (stack.length > 0) {
dummy.next = stack[0];
}
return result.next;
};

结果:

执行用时 :84 ms, 在所有 JavaScript 提交中击败了87.12%的用户

内存消耗 :38.3 MB, 在所有 JavaScript 提交中击败了5.36%的用户

看这个结果应该是空间复杂度不满足常数级别,也就是说我们设置的stack栈,它的长度其实是按K值变长的,果然不行,我们重新思考。

LeetCode Day 12的更多相关文章

  1. 【LeetCode】12 & 13 - Integer to Roman & Roman to Integer

    12 - Integer to Roman Given an integer, convert it to a roman numeral. Input is guaranteed to be wit ...

  2. 【一天一道LeetCode】#12 Integer to Roman

    一天一道LeetCode系列 (一)题目 Given an integer, convert it to a roman numeral. Input is guaranteed to be with ...

  3. LeetCode(12):整数转罗马数字

    Medium! 题目描述: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 ...

  4. 《LeetBook》leetcode题解(12):Integer to Roman[M]

    我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...

  5. LeetCode:12. Roman to Integer (Easy)

    1. 原题链接 https://leetcode.com/problems/roman-to-integer/description/ 2. 题目要求 (1)将罗马数字转换成整数:(2)范围1-399 ...

  6. LeetCode:12. Integer to Roman(Medium)

    1. 原题链接 https://leetcode.com/problems/integer-to-roman/description/ 2. 题目要求 (1) 将整数转换成罗马数字: (2) 整数的范 ...

  7. leetcode.字符串.12整数转罗马数字-Java

    1. 具体题目 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. I 1V   5X 10L     50C    100D    500M   1000例如, 罗马数字 2 写做  ...

  8. 【LeetCode】12. 整数转罗马数字

    12. 整数转罗马数字 知识点:字符串 题目描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 100 ...

  9. 【LeetCode】12. Integer to Roman 整数转罗马数字

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:roman, 罗马数字,题解,leetcode, 力扣, ...

随机推荐

  1. Java final 关键字的用法以及原理(7)

    /* final : 最终.作为一个修饰符, 1:可以修饰类,函数,变量. 2:被final修饰的类不可以被继承.为了避免被继承,被子类复写功能. 3:被final修饰的方法不可以被复写. 4:被fi ...

  2. 约数个数函数(d)的一个性质证明

    洛谷P3327 [SDOI2015]约数个数和 洛谷P4619 [SDOI2018]旧试题 要用到这个性质,而且网上几乎没有能看的证明,所以特别提出来整理一下. \[ d(AB) = \sum_{x| ...

  3. PAT Advanced 1008 Elevator (20) [数学问题-简单数学]

    题目 The highest building in our city has only one elevator. A request list is made up with N positive ...

  4. Chrome使用频率最高的快捷键

    标签 ctrl+T 打开新标签  ——— ctrl+W 关闭标签 ctrl+shift+T 打开上衣个被关闭的标签 ctrl+tab 标签向右切换 —— ctrl+shift+tab 标签向左切换 c ...

  5. ZJNU 1125 - A == B ?——中级

    处理后再判断即可,处理过程注意考虑全面. /* Written By. StelaYuri */ #include<iostream> #include<string> usi ...

  6. ZJNU 1069 - 表达式的转换——中级

    栈运用的模板题,对于符号进行出入栈操作,每次与栈顶的符号进行优先级判断,得出第一行后缀表达式. 在其后的化简计算中,每次用一个特殊符号(代码中使用了'?')代替原来的计算结果引用,并开一个数组表示每次 ...

  7. 富文本编辑器Tinymce的示例和配置

    Demo链接: https://download.csdn.net/download/silverbutter/10557703 有时候需要验证tinyMCE编辑器中的内容是否符合规范(不为空),就需 ...

  8. Oauth2.0详解及安全使用

    引言:刚刚参加工作的时候接到的第一个任务就是接入新浪的联合登录功能,当时新浪用的还是oauth1.0协议.接入的时候没有对oauth协议有过多的了解,只是按照开放平台的接入流程进行开发,当时还在想这么 ...

  9. 浙江省赛 ZOJ - 4033

    题意: 第一行给出T代表有几个测试样例, 第二行给出n代表有几个人, 第三行给出一个由0和1组成的字符串,0代表女生,1代表男生. 并且第i个人有i个宝石. 现在要把这些人分为四组,G1 G2 两组是 ...

  10. CodeForces 995B Suit and Tie(贪心,暴力)

    https://codeforces.com/problemset/problem/995/B 题意: 就是通过每次移动相邻的两位数,来使数值相同的数挨在一起,求最少要移动多少次. 思路: 直接从前往 ...