编程之美
hello_fjm
这个作者很懒,什么都没留下…
展开
-
0~n-1中缺失的数字
题目: 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。示例 :输入: [0,1,3]输出: 2解题思路:方法一:看到该题目我首先想到的就是将0~n-1加起来作为count1,将,将数组中的元素加起来作为count2,count1-count2的结果就是缺失的数字。class Solution { public int missingNumber(int[] nums.原创 2020-12-28 21:59:57 · 213 阅读 · 0 评论 -
第一个只出现一次的字符
题目: 在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。示例:s = “abaccdeff”返回 “b”s = “”返回 " "解题思路: 使用哈希表统计每个字符的个数,再遍历哈希表找到value为1的字符返回即可,注意要使用LinkedHashMap,是有序的,根据插入顺序进行遍历的。Java中HashMap、LinkedHashMap、TreeMap的区别import java.util.*;class Solution { publi原创 2020-12-24 21:04:20 · 131 阅读 · 0 评论 -
包含min函数的栈
题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.min(); --> 返回 -3.minStack.pop();minStack.top(); --> 返回 0.原创 2020-12-24 17:38:22 · 185 阅读 · 1 评论 -
合并两个排序的链表
题目: 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } }class Solution { public ListNode mergeT原创 2020-12-21 17:01:27 · 127 阅读 · 0 评论 -
反转链表
题目: 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } class Solution { public Lis原创 2020-12-20 22:14:54 · 102 阅读 · 0 评论 -
链表中倒数第K个节点
**题目:**输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.解题思路: 快慢指针,先让快指针先走k-1步,然后快慢指针一起走,之后快指针一直比慢指针快k- 1步,当快指针到最后一个节点时,慢指针指向原创 2020-12-20 16:01:58 · 101 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
**题目:**输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。示例:输入:nums = [1,2,3,4]输出:[1,3,2,4]注:[3,1,2,4] 也是正确的答案之一。解题思路: 看到这道题,我首先想到的是快排中partition的过程,利用partition过程接替即可,两个指针i和j,分别从数组的两边开始遍历,左边遇到偶数,右边遇到奇数的时候,两者进行交换即可。(只是快排中若是升序排序,则左边大于基准值,右边小于基准值时原创 2020-12-19 17:32:31 · 196 阅读 · 1 评论 -
旋转数组的最小数
题目: 一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。示例 1:输入:[3,4,5,1,2]输出:1示例 2:输入:[2,2,2,0,1]输出:0方法一: 遍历数组,相邻两数进行比较,当前一个数比后一个数小时,说明此时的后一个属就是当前数组中最小的数;若数组为景行旋转,则就直接返回数组中的第一个元素。class Solut原创 2020-12-19 16:52:47 · 167 阅读 · 1 评论 -
重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。示例:前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树:3/ 9 20/ 15 7前序遍历:根—左---右中序遍历:左—根---右整体思路:由前序遍历我们可以找到根结点,在中序遍历数组中找到根结点所对应的下标(rootIndex),rootIndex将中序遍历数组分成两部分,前部分原创 2020-09-11 10:20:39 · 119 阅读 · 0 评论 -
替换空格
题目:请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 :输入:s = “We are happy.”输出:“We%20are%20happy.”看到这个题目,脑子里立马就想到了字符串中的repleaceAll()这个函数,很方便,但是题目让实现一个函数解决问题,我们就不能直接用这个函数了。我们可以定义一个StringBuilder类型的字符串,然后将字符串转为数组,遍历字符数组,遇到空字符sb就追加%20,否则直接追加该字符。class Solution { publi原创 2020-09-10 09:00:08 · 100 阅读 · 0 评论 -
二维数组中的查找
题目:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[10, 13, 14, 17, 24],[18, 21, 23, 26, 30]]给定 target = 5,返回 true。给定 ta原创 2020-09-06 11:19:01 · 101 阅读 · 0 评论 -
数组中重复的数字
题目:在一个长度为== n 的数组 nums 里的所有数字都在 0~n-1== 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。方法一:利用set中元素不能重复的特点import java.util.*;class Solution { public int findRepeatNumber(int[] nums) { Set<Integer> set = new HashSet<>原创 2020-09-05 11:52:47 · 161 阅读 · 0 评论 -
2020-08-15
题目:题目的实质就是找到数组中超过一半的数方法一:利用Arrays.sort()将数组进行排序,中间位置的数出现的次数一定超过数组的一半.,如果数组时有序的那么时间复杂度就为O(1)。方法二:避免排序,每次删除两个不同的数,直到没有不同的,剩下的就为超过数组一半的数。删除过程:public static int Find(int[] a,int n){int answer = a[0];int number = 1;//i一定要从0开始for(int i = 0;i < n;i++)原创 2020-08-15 23:30:28 · 98 阅读 · 0 评论 -
整数A和B的二进制表示中有多少位不同
题目: 给定两个正整数(二进制表示形式)A和B,把A变为B需要改变多少位(bit)?也就是说,A,B的二进制表示形式中有多少位是不同的?思路:(1) C=A&B;A和B相与得到的C,C中的1代表该位A,B都为1;(2)D = A||B;D中的0代表该位A,B都为0;(3)E = A^B;E中的1代表该位A,B不同;所以最终就统计E中1的个数即可,利用按位与统计public int diff(int A,int B){int C = A&B;int D = A||B;int E原创 2020-08-14 21:26:53 · 291 阅读 · 0 评论 -
求二进制中1的个数
解法一: 以八位二进制数为例,一个数除以2余数为1,表示当前位置为1,余数为0 代表当前位置为0;对于一个二进制数除以一个2的操作,就相当于将该数直接右移一位。public int Count(int value){int num = 0;while(v){if(value%2 == 1){num++;}v = v/2;}return num;}解法二: 进行按位与操作,public int Count(int value){int num = 0;int flag = 0x0原创 2020-08-14 20:33:27 · 254 阅读 · 0 评论