算法
云原生手记
欢迎大家关注我的公众号“云原生手记”,将定期更新云计算技术文章
展开
-
一个整数二进制表示中1的个数 java实现
题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。题目解析:最直观的解法是先判断整数二进制表示中最右边以为是不是1.接着把整数右移一位(这边用右移不用除以2,是因为除法运算效率比移位运算要低得多),这样每次移动一位,直到整数为0.但是这样子会有一个问题,当输入是一个负整数,由于负整数最高位是1,右移一位后必须保持最高位还是1,这样一直死循环下去,因为移位后的数永远不会为0,原创 2017-05-23 09:37:43 · 3260 阅读 · 3 评论 -
LeetCode: Remove Nth Node From End of List go语言实现
Given a linked list, remove then-th node from the end of list and return its head.Example:Given linked list: 1->2->3->4->5, and n = 2.After removing the second node from the end, t...原创 2019-05-17 17:14:07 · 194 阅读 · 0 评论 -
LeetdCode: Reverse Nodes in k-Group go语言
Given a linked list, reverse the nodes of a linked listkat a time and return its modified list.kis a positive integer and is less than or equal to the length of the linked list. If the number of ...原创 2019-05-17 16:18:40 · 176 阅读 · 0 评论 -
Leetcode算法题 minimum depth of binary tree
题目描述:Given a binary tree, find its minimum depth.The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node. 思路:明确一点,不要读错题目意思,不是要你求出二叉树的最小深...原创 2018-08-01 23:44:47 · 154 阅读 · 0 评论 -
2017ebay在线编程题:判断死锁
题目描述:给你一个队列,队列长度是L,你可以对这个队列循环进行读操作和写操作,写操作(写入W个字符)时,如果队列中空余长度大于写的长度,那么可写,否则需要先进行读操作(读R个字符),等写空间大于W时,才能进行写操作;不可读:队列中的可读字符不超过R个,则不可读不可写:队列中的可写长度不超过W个,则不可写在这个读写过程中,可能出现死锁现象:例如,在写操作时空余长度小于W即不可写,但是原创 2017-10-24 22:13:48 · 728 阅读 · 0 评论 -
和为S的连续整数序列 JAVA实现
题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出描述:输出所有和为S的连续正原创 2017-10-29 16:42:46 · 740 阅读 · 0 评论 -
数组中只出现一次的数字 JAVA
数组中只出现一次的数字——剑指OFFER原题题目描述:一个整型数组B里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。假设,数组A中只有一个数字出现一次,其余都是出现两次,我们可以用一次遍历异或解决,例如数组A{1,2,1,2,3},将这五个数字异或的结果是3,不信你可以自己试试。原理就是两个相同的数字异或结果为0,0和任意数字异或,都是该数字本身但是我们原创 2017-10-29 15:58:14 · 866 阅读 · 0 评论 -
海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)
前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小堆比较好一些。 先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的),将这个数替换堆顶,并调整结构使之仍然是一个最小堆,这样,遍历完后,堆中的10000个数就是所需的最大的10000个。转载 2017-10-02 16:36:00 · 1097 阅读 · 0 评论 -
判断数组是否是二叉搜索树的后序遍历序列 JAVA实现
题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同;题目解析:二叉搜索树的特点是:根节点大于左子树所有节点,小于右子树所有节点。每棵子树都要满足这样的特点才是二叉搜索树。那我们的输入是二叉搜索树的后序遍历序列:左右根。可知输入数组的最后一个位置时这棵树的根节点。我们要做的是将左右子树划分出来原创 2017-06-02 10:54:01 · 711 阅读 · 1 评论 -
二叉树 逐层遍历
题目描述:从上往下打印出二叉树的每个节点,同层节点从左至右打印。解决思路:二叉树见下图,我们要打印的顺序是:1,2,3,4,5,6,7,8,9,10;可以看到我们先要打印根节点,之后打印第二层从左到右。我们这边要用到队列容器,先进先出的特点。首先我们在队列中插入根结点。1、然后我们取出队列中的节点,并且打印,同时将该节点的左右节点(不为空的节点,空节点不用插入)依次压入队列中,则此原创 2017-06-02 09:30:46 · 2640 阅读 · 0 评论 -
查找旋转数组的最小数字 JAVA实现
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。题目解析这其实是一个查找问题,查找最小元素,如果单纯遍历一边数组确实也可以查找到这个最小数字原创 2017-05-22 09:20:34 · 1219 阅读 · 1 评论 -
重构二叉树,java实现,剑指offer原题
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解题思想:每次从前序遍历中获取根节点,每次从中序遍历中获取左右子树长度一遍在前序遍历中划分左右子树找到相应子树的根节点。过程:一棵树的前序遍原创 2017-05-22 08:04:47 · 611 阅读 · 1 评论 -
从尾到头打印列表 java实现 剑指offer原题 java实现栈结构
题目分析:从尾到头打印列表,即输出列表上各个节点的值,首先输入是一个链表头结点,且这是一个单链表,可以看看代码中ListNode类。要知道所有节点的值必须遍历一遍链表,但是又要从后向前打印,但是链表只能从前往后遍历。要想实现:从前往后>>>>>>从后往前,这个很想栈结构的性质,先入后出,先遍历的节点最后输出。所以我们只需要建立一个栈结构即可(本题解决关键)。java中可以使用LinkedList集原创 2017-05-21 10:40:15 · 341 阅读 · 0 评论 -
剑指offer 字符串的排列原题,java实现,组合排列去重
首先讲一下原理:求字符串的排列,可以看成两步:1、把所有可能的字符都放在第一位,具体实现:可以遍历一次字符串,从第一个字符开始与第一个字符互唤,一次遍历后所有字符都会一次出现在第一个位置。在每次循环内实现第二步。2、将剩余的字符串的所有可能的字符放到该剩余字符串的位置(即重复1)。然后进行第三步,将原先互换的字符再次互换回来,恢复原始顺序,一遍进行后续的互换。过程图如下:假设字符串char原创 2017-05-21 09:25:06 · 649 阅读 · 1 评论 -
洗牌算法
问题描述所谓洗牌算法,就是给你一个1到n的序列,让你随机打乱,保证每个数出现在任意一个位置的概率相同,也就是说在n!个的排列中,每一个排列出现的概率相同。解决思路第一种思路——随机生成(1)生成一个随机数,放到数组中(2)重复(1)但是要确保与之前生成的随机数不一样,否则再次随机;第二种思路——位置交换1-n的序列放在数组中。从数组头开始,随机生成一个范原创 2017-06-05 10:49:37 · 564 阅读 · 1 评论 -
找出数组中出现次数大于一半的数字 Java实现 剑指offer
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0解题思路:第一种最简单,进行快速排序,然后取出最中间的数字,并且用这个数字遍历一遍数组,看看该数出现次数是不是大于数组长度的一半(实现代码如下,快速排序法);原创 2017-06-03 22:34:38 · 978 阅读 · 1 评论 -
快速排序法 java实现 三种方法实现
快速排序法(1)定义快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小。之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。(2)快速排序的三个步骤选择基准:在待排序列中,按照某种方式挑出一个元素,作为 "基准"(pivot)分割操作:以该基准在序列中的实际位置,把序列分成两个子序列。此时,在基准左边的元素都比原创 2017-05-18 14:27:41 · 7462 阅读 · 0 评论 -
二分法查找 JAVA实现
算法定义:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置的值则在数列的后半段中继续查找,直到找到为止。适用场景:当数据量很大时,数据有序但是不重复;java代码如下所示(直接取用BinarySearch即可测试):package test;import java.util原创 2017-05-18 15:53:31 · 427 阅读 · 1 评论 -
Leetcode: Remove Duplicates from Sorted Array GO语言实现
Given a sorted arraynums, remove the duplicatesin-placesuch that each element appear onlyonceand return the new length.Do not allocate extra space for another array, you must do this bymodifyi...原创 2019-05-17 17:37:57 · 117 阅读 · 0 评论