14.算法与数据结构
文章平均质量分 67
郑学炜
这个作者很懒,什么都没留下…
展开
-
39.笔试题-交换硬币
import java.util.Scanner;public class text {//4 7找数 public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int count = -1; while(scanner.hasNext()){...原创 2018-04-04 08:43:30 · 383 阅读 · 0 评论 -
36.数组-找旋转数组中最小的数
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 采用二分法解答这个问题, mid = low + (high - low)/2 需要考虑三种情况: (1)array[mid...原创 2018-04-02 21:12:31 · 163 阅读 · 0 评论 -
37.统计-1的个数
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。 public class Solution { public intNumberOf1Between1AndN...原创 2018-04-02 17:50:22 · 206 阅读 · 0 评论 -
32.位运算-数值的整数次方
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 理解了很久,大概有3种做法,第一种最low的,直接一个for暴力乘,这里不给出代码了。第二种:快速幂运算。下一位可以看成前一位的平方。 public class Solution { public double Power(double base, int exponent)...原创 2018-04-02 12:37:03 · 213 阅读 · 0 评论 -
38.笔试题-成长值计算
爱奇艺累计有2000万会员,为了提高会员权益以及减少运营成本,我们需要对用户分等级差异化运营,为此我们制定了用户成长体系,按成长值(最小为0)划分为不同等级。成长值计算公式为:会员成长值=每天成长值+任务成长值现在我们输入一组数据,表示用户的成长值计算规则,比如某个用户的每天成长值规则1 1 5 10,第一列1表示每日成长值规则,第二列1表示该条规则的生效开始时间,第三列5表示该条规则的生效截至时...原创 2018-04-14 18:15:17 · 736 阅读 · 0 评论 -
41.笔试题-排序问题
import java.util.Scanner;public class mayi{ public static void main(String[] args){ Scanner in = new Scanner(System.in); while(in.hasNext()){ int n = in.nextInt()...原创 2018-04-30 23:06:08 · 282 阅读 · 0 评论 -
5.排序-选择
选择排序:假设数组长度为lenght,选择排序的外循环也是lenght-1,内循环则为使用第一个数与其他的数比较,得出一个最小的数,将最小数与数组的第一个元素交换;第二次外循环,则用数组的第二个数与第三到底lenght个数比较,找到其中的最小值,并将此最小值与数组的第二个数交换,一直下去,直到数组末尾。package facehandjava.sort;public class Selection...原创 2018-03-22 00:01:29 · 96 阅读 · 0 评论 -
7.排序-归排
归并排序: 挺好玩的,就是分而治之。分到不能再分了,就慢慢每小块每小块开始排序(排序的过程中,如果左边小块排完了,那么右边的小块直接接入进去就可以输出排序好的合并块了)。然后经过递归返回最大的排序好的数组。package facehandjava.sort;public class MergerSort { public static void main(String[...原创 2018-03-22 00:01:21 · 286 阅读 · 0 评论 -
3.排序-快排
算法思想:基于分治的思想,是冒泡排序的改进型。首先在数组中选择一个基准点(该基准算法思想:基于分治的思想,是冒泡排序的改进型。首先在数组中选择一个基准点(该基准点的选取可能影响快速排序的效率,后面讲解选取的方法),然后分别从数组的两端扫描数组,设两个指示标志(lo指向起始位置,hi指向末尾),首先从后半部分开始,如果发现有元素比该基准点的值小,就交换lo和hi位置的值,然后从前半部分开始扫秒,发现...原创 2018-03-21 15:42:38 · 216 阅读 · 0 评论 -
4.排序-冒泡
此算法的好处在于,排序时候从后边开始,将较小者往前边移动。这样较小者会不断往前移动。解决了第一个算法,可能将较小者移到后边的情况,提高了算法效率。在上十万条数据的排序过程中,这种差异将会体现出来。 package facehandjava.sort;public class BubbleSort { public static void main(String[] args) { ...原创 2018-03-21 13:07:04 · 114 阅读 · 0 评论 -
16.二叉树-前中后序遍历-递归与非递归
二叉树的前序遍历,中序遍历,后序遍历(递归的写法)///////////////////////////////////递归//////////////////////////////////////////////////////// //下面先构建树的类 package facehandjava.tree;public class Node { private int data;...原创 2018-04-10 18:58:07 · 205 阅读 · 0 评论 -
11.链表-判断链表有无环
判断链表有无环 package facehandjava.Linked;public class hasLoop { public static boolean hasLoop(Node node) { Node node1 = node; Node node2 = node; while (node1.getNext()!= null &&...原创 2018-04-10 21:13:31 · 142 阅读 · 0 评论 -
40.笔试题-马赛跑
N个马必须胜过另外N个马。取得n跟n-1比较即可。 import java.util.Arrays;import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while...原创 2018-04-04 08:40:54 · 400 阅读 · 0 评论 -
42.笔试题-数组两两相同找不同数
面试题:找出数组中只出现一次的2个数(异或的巧妙应用)(出现3次)2013-10-02 23:49 by youxin, 7423 阅读, 0 评论, 收藏, 编辑题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。分析:这是一道很新颖的关于位运算的面试题。首先我们考虑这个问题的一个简单版本:一个数组里除...原创 2018-05-12 10:36:37 · 2851 阅读 · 0 评论 -
24.二叉树-给前中求后序
分四步走 (1)确定树的根节点。树根是当前树中所有元素在先序遍历中最先出现的元素,即先序遍历的第一个结点就是二叉树的跟 (2)求解树的子树。找到根在中序遍历的位置,位置左边就是二叉树的左孩子,位置右边是二叉树的右孩子,如果根结点左边或右边为空,那么该方向子树为空;如果根节点左边和右边都为空,那么根节点已经为叶子节点。 (3)对二叉树的左、右孩子分别进行步骤(1)(2),直到求出二叉树的结构为止。(...原创 2018-05-02 00:18:21 · 220 阅读 · 0 评论 -
23.二叉树-求树节点间的最大距离
问题定义如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。书上的解法书中对这个问题的分析是很清楚的,我尝试用自己的方式简短覆述。计算一个二叉树的最大距离有两个情况:· 情况A: 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点。· 情况B: 路径不穿过根节...原创 2018-05-01 22:34:57 · 1181 阅读 · 0 评论 -
22.二叉树-求树的宽度
使用队列,层次遍历二叉树。在上一层遍历完成后,下一层的所有节点已经放到队列中,此时队列中的元素个数就是下一层的宽度。以此类推,依次遍历下一层即可求出二叉树的最大宽度。 package facehandjava.tree;import java.util.LinkedList;import java.util.Queue;public class WidthTree { public stat...原创 2018-05-01 22:12:31 · 702 阅读 · 0 评论 -
8.排序-堆排
堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。堆 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图:同时,我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是下...原创 2018-05-01 02:52:17 · 258 阅读 · 0 评论 -
6.排序-直插
插入排序算法思想:每趟将一个元素,按照其关键字的大小插入到它前面已经排序的子序列中,依此重复,直到插入全部元素。 package facehandjava.sort;public class InsertSort { public static void main(String[] args) { int[]arrays = {10, 5, 36, 78,56,2, 5, 8,...原创 2018-04-30 23:51:27 · 179 阅读 · 0 评论 -
9.链表-翻转链表
/** * 翻转链表 */package facehandjava.Linked;public class Reversal { public static void main(String[] args) { Node n6 = new Node(11,null); Node n5 = new Node(9, n6); Node n4 = new ...原创 2018-04-11 13:13:49 · 99 阅读 · 0 评论 -
17.二叉树-层次遍历-上下左右与上下右左
从上往下打印出二叉树的每个节点,同层节点从左至右(从右到左)打印。思路:利用一个队列存储每个节点,并且每次循环时,弹出第一个节点,并存进弹出节点的左右树节点到树最后。////////////////////////////////////////从左到右//////////////////////////////////////package facehandjava.tree;import ja...原创 2018-04-10 21:39:02 · 1354 阅读 · 0 评论 -
28.暴力枚举-和为S的两个最小乘积数字
题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。 import java.util.ArrayList;public class Solution { public ArrayList<Integer> FindNumbersWithSum(i...原创 2018-03-21 00:24:16 · 180 阅读 · 1 评论 -
21.二叉树-求树的深度
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。package facehandjava.tree;public class DepthTree { public static Node init() {//注意必须逆序建立,先建立子节点,再逆序往上建立,因为非叶子结点会使用到下面的节点,而初始化是按顺序初始化的...原创 2018-03-20 17:53:43 · 439 阅读 · 0 评论 -
20.二叉树-是否为平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树平衡二叉树:就是左右子节点高度差不大于1; public class Solution { public boolean IsBalanced_Solution(TreeNode root) { if(root==null){ return true; } int left =...原创 2018-03-24 18:52:25 · 137 阅读 · 0 评论 -
30.递归-求1-n的和不用乘除和关键字等
题目描述求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 public class Solution { public int Sum_Solution(int n) { int sum = n; boolean ans = (sum>0)&&((sum...原创 2018-03-22 16:27:17 · 526 阅读 · 0 评论 -
31.位运算-没有加减乘除的加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。首先看十进制是如何做的: 5+7=12,三步走第一步:相加各位的值,不算进位,得到2。第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果。第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12。同样我们可以用三步走的方式计算二进制值相加: 5-101,7-...原创 2018-03-22 16:09:47 · 247 阅读 · 0 评论 -
14.链表-倒数第K个节点
题目描述输入一个链表,输出该链表中倒数第k个结点。 两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走k步,到达第k+1个节点。然后两个指针同时往后移动,当第一个结点到达末尾的下一个节点的时候,第二个结点所在位置就是倒数第k个节点了。。 package facehandjava.Linked;public class KNode { public static void...原创 2018-03-18 10:32:20 · 160 阅读 · 0 评论 -
27.暴力枚举--空格替换
时间限制:1秒 空间限制:32768K 热度指数:503697本题知识点: 字符串 算法知识视频讲解题目描述请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 public class Solution { public String replaceSpace(StringBuffer s...原创 2018-03-18 10:31:49 · 298 阅读 · 0 评论 -
10.链表-倒叙打印
输入一个链表,从尾到头打印链表每个节点的值。 除了可以用翻转链表外,还有两种方法,递归与栈。重点讲一下递归的(渣渣思考了挺久的):package facehandjava.Linked;import java.util.ArrayList;import java.util.Arrays;import java.util.Iterator;import java.util.List;...原创 2018-03-18 01:22:11 · 312 阅读 · 0 评论 -
29.递归-斐波那契数列与青蛙跳台阶与矩形覆盖
时间限制:1秒 空间限制:32768K 热度指数:204093 算法知识视频讲解题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。递归推一下,可以知道f(n)=f(n-1)+f(n-2) public class Solution { public int JumpFloor(int target) { if(target==0){...原创 2018-03-17 10:50:13 · 148 阅读 · 0 评论 -
13.链表-链表公共点
题目描述输入两个链表,找出它们的第一个公共结点。 两种思路,个人喜欢第一种:1、L1 l2各自走一遍,如果都到底部还未相遇,则证明l1 l2长度不一样,分别到null后,l1换l2链表头开始走,l2换l1链表头走,然后接着他们就会相遇了,遇到的第一个点就是公共点。因为大家所走的路是相同的。 2、用一个stact栈存2个链表的数据,然后开始pop,pop到不相等的,前1个想等的为他们的公共节点。所以...原创 2018-03-17 10:24:53 · 222 阅读 · 0 评论 -
25.暴力枚举-DNA
DNA分子是以4种脱氧核苷酸为单位连接而成的长链,这4种脱氧核苷酸分别含有A,T,C,G四种碱基。碱基互补配对原则:A和T是配对的,C和G是配对的。如果两条碱基链长度是相同的并且每个位置的碱基是配对的,那么他们就可以配对合成为DNA的双螺旋结构。现在给出两条碱基链,允许在其中一条上做替换操作:把序列上的某个位置的碱基更换为另外一种碱基。问最少需要多少次让两条碱基链配对成功输入描述:输入包括一行: ...原创 2018-03-15 16:25:46 · 158 阅读 · 0 评论 -
15.链表-两个递增链表合并
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 思路:如果pre和list都是null,先用pre存进第一个取得的节点。然后让它等于list,这样之后list指向的地址怎么变化,它的指向就会跟着list去跳了。其中两句标红的是关键, package facehandjava.Linked;public class MergeTwo { ...原创 2018-03-19 11:18:32 · 234 阅读 · 0 评论 -
35.数组-连续子数组的最大和
题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度至...原创 2018-03-24 18:17:45 · 150 阅读 · 0 评论 -
34.数组-构建乘积数组
时间限制:1秒 空间限制:32768K 热度指数:49375本题知识点: 数组 算法知识视频讲解题目描述给定一个数组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]。不能使用除法。 剑指的思路: B[i]的值可以看作下图的矩阵中每行的乘积。 下三角用连乘可以很容求得,上三角...原创 2018-03-24 17:35:28 · 232 阅读 · 0 评论 -
18.二叉树-镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。package facehandjava.tree;public class MirrorTree { public static Node init() {//注意必须逆序建立,先建立子节点,再逆序往上建立,因为非叶子结点会使用到下面的节点,而初始化是按顺序初始化的,不逆序建立会报错 Node J = new Node...原创 2018-03-20 15:43:40 · 117 阅读 · 0 评论 -
33.位运算-二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 public class Solution { public int NumberOf1(int n) { int count = 0; while(n!=0){ if((n&1)==1){ count++; } ...原创 2018-03-19 20:46:11 · 179 阅读 · 0 评论 -
2.查找-二维排序数组二分查找
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。两个思路。1. 先列二分,再从上到下每行遍历二分法。2. 一种从左下角开始,小的上移,大的右移。 //1.列二分,遍历列,行二分: public class Solution { public boolean Find(in...原创 2018-03-23 10:51:05 · 860 阅读 · 0 评论 -
1.查找-一维排序数组二分查找
统计一个数字在有序数组中出现的次数。 //找出特殊的,比如空的,比如只有1个元素的。//注意min <= max,上下限。 package facetest;public class BinaryChop { public static void main(String[] args) {// int[] arrays = {1, 2, 3, 3, 3, 4, 5, 6,...原创 2018-03-23 00:56:03 · 419 阅读 · 0 评论 -
12.链表-判断链表的环入口
题目描述一个链表中包含环,请找出该链表的环的入口结点。 思路:快的走2步,慢的走1步,这样可以到B点相遇,而快的节点比慢的走多了一个圈。那么快的再赋值起点的节点,然后每次走1步的话,其实由上图可以看到,蓝色和黑色的距离是一样的,那么再开始慢的和快的各走一步,就可以在C点处相遇的了。 package facehandjava.Linked;public class hasLoopDoor { ...原创 2018-03-19 12:49:07 · 142 阅读 · 0 评论