随笔分类 - 剑指offer(go版本)
摘要:字符串的排列 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。 思路: 对于一个长
阅读全文
摘要:二叉搜索树与双向链表 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 思路: 二叉搜索树的中序遍历为 递增序列 。将 二叉搜索树 转换成一个 “排序的循环双向链表” ,其中包含三个要素: 排序链表: 节点应从小到大排序,因此应使用
阅读全文
摘要:复杂链表的复制 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 思路:1)空间复杂度O(1),时间复杂度O(N)
阅读全文
摘要:二叉树中和为某一值的路径 输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 解题思路: 递归回溯的解法 1.按照前序方式去遍历(根,左,右)2.递归处理: 忽略空节点 递归过程中去修改sum的
阅读全文
摘要:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 解题思路二叉搜索树:左子树的元素是都小于根元素,右子树都大于根元素后序遍历:首先遍历左子树,然后遍历右子树,最后访问根结点,所以数组最
阅读全文
摘要:从上往下打印二叉树 从上往下打印出二叉树的每个节点,同层节点从左至右打印。 func PrintFromTopToBottom( root *TreeNode ) []int { if root == nil { return []int{} } queue := []*TreeNode{root}
阅读全文
摘要:栈的压入、弹出序列 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。 解题思路1,用go语言slice建一个辅助栈,来顺序添加压入序列2,每次添加一个元素,去跟弹出序列比较,若不同,继续添加。若相同,则弹出,继续拿新建栈的栈顶元素去跟
阅读全文
摘要:题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。 思路:一个栈存普通元素,一个最小栈存放目前位置最小的元素,只在压入的时候判断是否为空以及最小元素,其他情况正常处理。 package main import ( "math" ) var stack = []int{}
阅读全文
摘要:顺时针打印矩阵 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 思路:第一个
阅读全文
摘要:题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 这题分两步: 第1:在树A中找到和树B的根节点的值一样的节点R,注意树的节点值可以有多个相同的值。 第2:判断树A中以R为根节点的子树是不是包含和B一样的树结构。 这题难在递归基和判断树节点为空该返
阅读全文
摘要:题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 思路: 归并算法的思路,注意首先判断两个链表节点都不为空,判断大小while循环之后,要看哪个链表节点不为空,使用哨兵节点的方法处理头节点。 func Merge( pHead1 *ListNod
阅读全文
摘要:题目描述 输入一个链表,反转链表后,输出新链表的表头。 func ReverseList( head *ListNode ) *ListNode { // write code here if head == nil || head.Next == nil { return head } var p
阅读全文
摘要:题目描述 输入一个链表,输出该链表中倒数第k个结点。 思路:要保证两个链表之间相差k个,这样计算移动才是正确结果,这题受到以前做的题目的影响,面试的时候一定要问清楚k会不会大于总长度,如果大于总长度是取模还是出错,这题就是返回错误信息 双指针,一根指针先走k步(边走边判断是否为空,因为链表长可能小于
阅读全文
摘要:13 调整数组顺序使奇数位于偶数前面 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 方法1:插入排序的思路:时间复杂度是N^2; 记录已经是奇数的位置下标(视作为有序区域)
阅读全文
摘要:题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 保证base和exponent不同时为0 思路: tmp & 1 == 1,只能判断最后一位,0011 & 0010 = 0010 = 2. 快速幂的原理相当于将指数变为二进制,
阅读全文
摘要:题目描述 输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。 因为golang的int是无限精度的,c++的int是32位的,所以golang的负数相当于前面有无限个1,要对golang的负数做处理. func NumberOf1( n int ) int { // write
阅读全文
摘要:题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 注意n==0的时候有0中方法。 当 n > 2 时,每次新增加一列,可以选择竖着放置一个 21 的小矩形或者横着放置两个 21 的小矩形。 如果选择竖着放置一个
阅读全文
摘要:题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 follow up问题要思考前面解决问题的方法,这题就是用数学方法统计出结果的例子。 f(n) = f(n - 1) + f(n - 2) + f(n - 3) + ... +
阅读全文
摘要:题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 跳台阶是一个经典的问题,可以用递归或动态规划的方法来解决。假设有 n 级台阶,每次可以跳 1 级或 2 级,求跳上这个台阶的不同跳法总数。 使用递归的方法可以表示为: func jumpFloor(
阅读全文
摘要:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。 n<=39 要记住第n项,指的是1开始,因为下标会小一个数,下标从0开始。 func Fibonacci( n int ) int { // write code here if n == 0 { return 0 }
阅读全文