tk
1
奇零可草
这个作者很懒,什么都没留下…
展开
-
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case
/* * 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case * 等关键字及条件判断语句(A?B:C)。 * 思路:等差数列求和公式:n*(n+1)/2=(n^2+n)/2,由于不能用除法,因此可以右移一位表示除以2 */public class Sum_Solution { public int sum_Solution(int原创 2018-02-23 15:07:58 · 1510 阅读 · 1 评论 -
删除单链表中重复的结点
/* * 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 * 例如,链表1->2->3->3-4->4->5 处理后为 1->2->5 * 递归思想 */class ListNode { int val; ListNode next = null; ListNode(int val){ this.val = val;原创 2018-02-06 10:12:15 · 433 阅读 · 1 评论 -
寻找两个单链表第一个公共的节点
import java.util.Stack;/* * 找到两个链表第一个公共的节点 */class ListNode { int val; ListNode next = null; ListNode(int val){ this.val = val; }}public class FindFirstCommonNode { public ListNode原创 2018-02-06 09:58:02 · 191 阅读 · 1 评论 -
矩形覆盖1
/* * 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。 * 请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? * 思路:画图,数学归纳法 */public class RectCover { //规律:斐波那契数列 public int rectCover(int target) { if(target == 0) return 0;原创 2018-01-27 15:05:05 · 144 阅读 · 1 评论 -
把数组排成最小的数
/* * 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 * 例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 * 思路:先排序,然后不断地比较两个字符串(数字转化成字符串)的大小,把字符串小的放在前面, 这样可以保证最后得到的字符串是最小的。 注意:空值null与""的区别 */原创 2018-01-27 15:00:55 · 256 阅读 · 1 评论 -
《剑指offer》-顺时针打印矩阵
import java.util.*;/* *输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字, *例如,如果输入如下矩阵: *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. */public class PrintMatrix { Arr原创 2018-01-27 14:53:10 · 147 阅读 · 0 评论 -
数值的整数次方
/* * 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 * 思路:考虑将a^n问题分解成a^(n/2)问题,只要知道a^(n/2),然后平方就可以求出a^n; * 同理,只要知道a^(n/4),然后平方就可以求出a^(n/2).... * 依次类推,通过不断地分解来减小运算次数,算法使用递归实现,要注意n是奇数的情况要多乘一原创 2018-01-27 14:34:24 · 257 阅读 · 1 评论 -
《剑指offer》-任意非负整数区间中1出现的次数
/* * 求出1~13的整数中1出现的次数,1~13中包含1的数字有1、10、11、12、13,因此共出现6次, * 很快的求出任意非负整数区间中1出现的次数。 */public class NumberOf1Between1AndN_Solution { //将数字转化成字符串,判断字符串中包含多少个1 public int numberOf1Between1AndN_Soluti原创 2018-01-27 14:22:38 · 402 阅读 · 0 评论 -
《剑指offer》-二进制中1的个数
/* *输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 */public class NumberOf1 { //法一:一个数与它的减一做与运算可以把它的1消掉,直到这个数减为0。因此做了多少次与运算,就有多少个1 public int numberOf1(int n) { int count = 0; while(n != 0) { n = n & (n原创 2018-01-27 10:46:34 · 128 阅读 · 0 评论 -
《剑指offer》-构建乘积数组
/* * 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1], * 其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1](不包含第i项)。不能使用除法。 */public class Multiply { //算法一:复杂度O(n^2) public int[] multiply(int[] A) {原创 2018-01-27 10:29:33 · 246 阅读 · 0 评论 -
《剑指offer》-机器人能够达到的格子数
/* *地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 *例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子? *思路:回溯法,要有机器人当前的坐标原创 2018-01-27 09:48:29 · 532 阅读 · 0 评论 -
《剑指offer》-找出数组中出现次数超过一半的数字
import java.util.*;public class MoreThanHalfNum_Solution { //算法一:暴力搜索,复杂度O(n^2) public int moreThanHalfNum_Solution(int [] array) { if(array == null || array.length <= 0) return 0; if(array.len原创 2018-01-27 09:38:05 · 182 阅读 · 0 评论 -
《剑指offer》-输出旋转数组的最小元素
/* * 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 * 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 * 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 * NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 * */import java.util.*;public class Min原创 2018-01-27 09:17:42 · 140 阅读 · 0 评论 -
《剑指offer》-将二叉搜索树转化为双向链表
/* * 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。 * 要求不能创建任何新的结点,只能调整树中结点指针的指向。 */public class ConvertBinaryTreeToDoublyLinkedList { public TreeNode Convert(TreeNode pRootOfTree) { if(pRootOfTree == nu原创 2018-02-02 20:03:15 · 351 阅读 · 0 评论 -
《剑指offer》-用两个栈来实现一个队列
import java.util.Stack;/* *用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 *思路:两次先进后出变成先进先出(画图) */public class UseStackImplementQueue { Stack stack1 = new Stack(); Stack stack2 = new Stack();原创 2018-02-06 10:25:41 · 140 阅读 · 0 评论 -
《剑指offer》-实现一个能够得到栈最小元素的min函数
/* * 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。 * 思路:构造一个辅助栈,保证每一次辅助栈压入的都是当前栈的最小元素 */import java.util.Stack;public class FindMinValueOfStack { Stack dataStack = new Stack(); Stack coopStack = new Stac原创 2018-02-06 10:32:10 · 221 阅读 · 0 评论 -
《剑指offer》-判断序列是否为栈的弹出顺序
import java.util.Stack;/* * 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。 * 假设压入栈的所有数字均不相等。 * 例如:序列1,2,3,4,5是某栈的压入顺序, * 序列4,5,3,2,1是该压栈序列对应的一个弹出序列, * 但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) *原创 2018-02-06 10:36:58 · 205 阅读 · 0 评论 -
《剑指offer》-将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数
/* * 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 * 数值为0或者字符串不是一个合法的数值则返回0获得123的方法:首先1*10+2=12,12*10+3=123备注:字符'0'对应的ASCII码值是48(转化为int类型),而字符'9'对应的ASCII码值是57输入负的数据会有符号位,输入正的数据可能有符号位 */public class StrToI原创 2018-02-23 15:03:01 · 2216 阅读 · 2 评论 -
《剑指offer》-求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号
/* * 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。 * 思路:不能使用四则运算,就只剩下位运算了。例如17+5 * 17转化成二进制10001,5转化成二进制0101。 * 首先不考虑进位,则1+1=0,1+0=1,0+1=1,0+0=0 * 可以看出这是位^运算(异或),这一步的结果是10100. * * 接下来考虑是否产生进位,则1+1=1原创 2018-02-23 13:12:27 · 354 阅读 · 0 评论 -
《剑指offer》-按字典序列打印出字符串中字符的所有排列
/* * 输入一个字符串,按字典序打印出该字符串中字符的所有排列。 * 例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 * 思路: * 分治法:将第一个位置的元素与其他所有位置进行交换, * 之后针对得到的每一个字符串,将第二个位置的元素与其他所有位置进行交换 * .... */import java.util...原创 2018-02-08 10:04:48 · 611 阅读 · 0 评论 -
《剑指offer》-将一个字符串中的空格替换成“%20”
/* * 请实现一个函数,将一个字符串中的空格替换成“%20”。 * 例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 */public class ReplaceSpace { public String replaceSpace(StringBuffer str) { if(str == null) return new原创 2018-02-23 12:09:58 · 213 阅读 · 0 评论 -
《剑指offer》-把字符串序列循环左移K位后的序列输出
/* * 对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。 * 例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果, * 即“XYZdefabc”。是不是很简单?OK,搞定它! * * 考察字符串截取,注意字符串为空的情况 */public class LeftRotateString { public String leftRotateStrin...原创 2018-02-23 11:55:03 · 598 阅读 · 0 评论 -
《剑指offer》-找出字符流中第一个只出现一次的字符
/* * 请实现一个函数用来找出字符流中第一个只出现一次的字符。 * 例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。 * 当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。 * 如果当前字符流没有存在出现一次的字符,返回#字符。 */import java.util.*;public class FirstAppearin原创 2018-02-23 11:48:45 · 252 阅读 · 0 评论 -
《剑指offer》-实现一个函数用来判断字符串是否表示数值(包括整数和小数)
/* * 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。 * 例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 * 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。 */public class IsNumeric { public boolean isNumeric(char[]原创 2018-02-23 11:30:22 · 1104 阅读 · 0 评论 -
《剑指offer》-翻转单词顺序列
/* * 翻转单词顺序列 * 例如,“student. a am I” * 正确的句子应该是“I am a student.” * 注意辨别空串和空格串! */public class ReverseSentence { public String reverseSentence(String str) { if(str == null) return null; //判断s原创 2018-02-23 10:18:55 · 164 阅读 · 0 评论 -
《剑指offer》-寻找二叉搜索树第k大的结点
/* * 给定一颗二叉搜索树,请找出其中的第k大的结点。 * 如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。 * 思路:本题实际上就是一个二叉搜索树的中序遍历,是因为二叉搜索树的中序遍历是一个递增序列 */public class FindKthNode { //非递归中序遍历 public TreeNode kthNode(Tr原创 2018-01-30 15:58:59 · 318 阅读 · 0 评论 -
《剑指offer》-求二叉树的深度
/* * 输入一棵二叉树,求该树的深度。 * 从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径, * 最长路径的长度为树的深度。 * 思路:考虑用递归的思想,一个根节点的深度等于其左右节点深度的最大值加1 */public class TreeDepth { public int treeDepth(TreeNode root) { if(root == null)原创 2018-01-30 15:47:07 · 147 阅读 · 0 评论 -
《剑指offer》-二叉树的镜像
/* * 操作给定的二叉树,将其变换为源二叉树的镜像 * 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 1原创 2018-01-30 11:43:51 · 108 阅读 · 0 评论 -
《剑指offer》-正则表达式匹配
/* * 请实现一个函数用来匹配包括'.'和'*'的正则表达式。 * 模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 * 在本题中,匹配是指字符串的所有字符匹配整个模式。 * 例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配 */public class RegularMatch { p原创 2018-01-30 10:26:43 · 156 阅读 · 0 评论 -
《剑指offer》-调整数组顺序使奇数位于偶数前面
import java.util.*;/* * 输入一个整数数组,实现一个函数来调整该数组中数字的顺序, * 使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分, * 并保证奇数和奇数,偶数和偶数之间的相对位置不变。 */public class ReOrderArray { //算法一:借助两个list分别存放奇数数字和偶数数字(空间复杂度比较大) public原创 2018-01-30 10:24:33 · 105 阅读 · 0 评论 -
《剑指offer》-从尾到头打印单链表
import java.util.ArrayList;import java.util.Stack;/* * 输入一个链表,从尾到头打印链表每个节点的值。 */class ListNode { int val; ListNode next = null; ListNode(int val){ this.val = val; }}public class Pr原创 2018-02-02 19:57:26 · 209 阅读 · 0 评论 -
《剑指offer》-反转单链表
/* *输入一个链表,反转链表后,输出链表的所有元素。 */public class ReverseList { public ListNode reverseList(ListNode head) { if(head == null) return head; ListNode pre = head; ListNode cur = head.next; ListN原创 2018-02-02 19:50:18 · 190 阅读 · 0 评论 -
《剑指offer》-找出数组中所有滑动窗口里数值的最大值
/* * 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。 * 例如,如果输入数组{2,3,4,2,6,2,5,1},大小是3; * 滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, * {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, * {2,3,4,2,[6,2,5],1}原创 2018-01-26 15:28:05 · 393 阅读 · 0 评论 -
《剑指offer》- 输出所有和为S的连续正数序列
import java.util.ArrayList;/* * 输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序 * 思想:定义两个指针 */public class FindContinuousSequence { public ArrayList> findContinuousSequence(int sum) { int i原创 2018-01-25 15:23:42 · 308 阅读 · 0 评论 -
《剑指offer》-斐波那契数列
/* * 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。 * 0<=n<=39,从0开始算 */public class Fibonacci { public int fibonacci(int n) { if(n == 0) { return 0; } if(n原创 2018-01-25 15:19:50 · 122 阅读 · 0 评论 -
《剑指offer》-请找出数组中任意一个重复的数字
import java.util.Arrays;/* * 请找出数组中任意一个重复的数字。 * 例如,如果输入长度为7的数组{2,3,1,0,2,5,3}, * 那么对应的输出是第一个重复的数字2。 */public class Duplicate { //算法一:复杂度O(n^2) public boolean duplicate(int numbers[], int leng原创 2018-01-25 15:13:36 · 293 阅读 · 0 评论 -
《剑指offer》-复杂链表的复制
/* * 输入一个复杂链表(每个节点中有节点值,以及两个指针, * 一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。 *(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) * 注:本题分三步走:第一步先复制链表;第二部根据复制链表的特点,对新链表关联上随机节点;第三步拆分链表 */class RandomListNode原创 2018-02-01 15:36:41 · 195 阅读 · 0 评论 -
《剑指offer》-判断某整数数组是不是某二叉搜索树后序遍历的结果
/* * 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。 * 如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 * 思路:二叉排序树:左子树比根节点小,右子树比根节点大。 * 从后序遍历的结果来看,可以划分成前面一段(左子树)和中间一段(右子树) * 确定左子树、右子树的起点和终点,分别对他们递归。 * 递归的终止条件是:起点、终点重合(到叶原创 2018-02-01 15:26:09 · 858 阅读 · 1 评论 -
《剑指offer》-序列化和反序列化二叉树
/* *请实现两个函数,分别用来序列化和反序列化二叉树 *注:这里采用的是前序遍历的方式 */public class SerializeBinaryTree { String Serialize(TreeNode root) { if(root == null) return ""; StringBuilder sb =原创 2018-02-01 15:20:28 · 222 阅读 · 0 评论 -
《剑指offer》-重建二叉树
/* * 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。 * 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 * 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 * 思路:所谓的重建二叉树,无非就是找到该二叉树的根节点和左右节点 */public class ReConstructBina原创 2018-02-01 15:08:06 · 176 阅读 · 0 评论