[剑指Offer] Day 02

剑指 Offer 06. 从尾到头打印链表输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 解题思路:首先遍历一遍链表,获得链表长度。然后创建对应长度的数组,再从头遍历链表,依次存到数组中,存放的时候从右侧开始放。 时间复杂度:O(N) 空间复杂度:O(1) class Solution { fun reversePrint(head: ListNode?): IntArray { var length = 0 var p = head while (p != null) { p = p.next length++ } var intArray = IntArray(length) p = head while (p != null) { intArray.set(…

[剑指Offer] Day 01

剑指 Offer 09. 用两个栈实现队列用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 解题思路:定义两个栈inStack和outStack。入队操作比较简单:队列中元素入队时就push到inStack中。出队列时统一"倒"到outStack中,顺序上做了一次调换。要考虑以下几种情况:1.如果outStack中还有元素,直接pop即可;2.如果outStack没有元素,inStack也没有元素了,表明队列已经为空返回-1;3.如果outStack没有元素,inStack仍然有元素。先将所有元素"倒"到outStack中,然后弹出顶部元素即可。 class CQueue() { val inStack = Stack<Int>() val outStack = Stack<Int&…

[每日一题] 67. 二进制求和

链接:Leetcode 难度等级:Easy 给你两个二进制字符串,返回它们的和(用二进制表示)。 输入为 非空 字符串且只包含数字 1 和 0。 示例 1: 输入: a = "11", b = "1" 输出: "100" 示例 2: 输入: a = "1010", b = "1011" 输出: "10101" 思路:这里采用了模拟数字按位累加的做法,“逢二进一“。把累加的结果放到StringBuilder中,最后倒置一次(因为累加是从个位加起的)。 ps:这里有点坑的是一开始误以为kotlin的Char类型的toInt()(已被废弃,使用code属性替代)方法可以直接把字符转换为数字,其实这样直接转换得到的是该数字对应的ASCII码。需要先把Char转换为String再toInt()。 class Solution { fun addBinary(a: String,…

[每日一题] 66. 加一

链接:Leetcode 难度等级:Easy 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。 示例 1: 输入:digits = [1,2,3] 输出:[1,2,4] 解释:输入数组表示数字 123。 示例 2: 输入:digits = [4,3,2,1] 输出:[4,3,2,2] 解释:输入数组表示数字 4321。 示例 3: 输入:digits…

[每日一题] 58. 最后一个单词的长度

链接:Leetcode 难度等级:Easy 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1: 输入:s = "Hello World" 输出:5 解释:最后一个单词是“World”,长度为5。 示例 2: 输入:s = "   fly me   to   the moon  " 输出:4 解释:最后一个单词是“moon”,长度为4。 示例 3: 输入:s = "luffy is still joyboy" 输出:…

[每日一题] 53. 最大子数组和

链接:Leetcode 难度等级:Easy 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例 1: 输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。 示例 2: 输入:nums = [1] 输出:1 示例 3: 输入:nums = [5,4,-1,7,…