Redis
Redis[1]Redis介绍1.键值型与NoSqlRedis是一种键值型的NoSql数据库,这里有两个关键字:
键值型
NoSql
其中键值型,是指Redis中存储的数据都是以key.value对的形式存储,而value的形式多种多样,可以是字符串.数值.甚至json:
而NoSql则是相对于传统关系型数据库而言,有很大差异的一种数据库。
对于存储的数据,没有类似Mysql那么严格的约束,比如唯一性,是否可以为null等等,所以我们把这种松散结构的数据库,称之为NoSQL数据库。
2. Redis数据类型1 五种常用数据类型介绍Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:
字符串(string):普通字符串,Redis中最简单的数据类型,string的内部结构实现上类似Java的ArrayList
哈希(hash):也叫散列,类似于Java中的HashMap结构
列表(list):按照插入顺序排序,可以有重复元素,类似于Java中的LinkedList,底层是双向链表
集合(set):无序集合,没有重复元素,类似于Ja ...
java基础
java基础1.面向对象基础1.面向对象和面向过程的区别?面向对象和面向过程是一种软件开发思想。
两者的主要区别在于解决问题的方式不同:
面向过程把解决问题的过程拆成一个个方法,通过一个个方法的执行解决问题。
面向对象会先抽象出对象,然后用对象执行方法的方式解决问题。
2.创建一个对象用什么运算符?对象实体与对象引用有何不同?new 运算符,new 创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)。
一个对象引用可以指向 0 个或 1 个对象(一根绳子可以不系气球,也可以系一个气球);
一个对象可以有 n 个引用指向它(可以用 n 条绳子系住一个气球)
3.对象的相等和引用相等的区别
对象的相等一般比较的是内存中存放的内容是否相等。
引用相等一般比较的是他们指向的内存地址是否相等。
12345678910111213String str1 = "hello";String str2 = new String("hello");String str3 = "hello";// 使用 = ...
滑动窗口的最大值
滑动窗口的最大值给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
示例 1:
1234567891011输入:nums = [1,3,-1,-3,5,3,6,7], k = 3输出:[3,3,5,5,6,7]解释:滑动窗口的位置 最大值--------------- -----[1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 3 [-1 -3 5] 3 6 7 5 1 3 -1 [-3 5 3] 6 7 5 1 3 -1 -3 [5 3 6] 7 6 1 3 -1 -3 5 [3 6 7] 7
示例 2:
12输入:nums = [1], k = 1输出:[1]
提示:
1 <= nums.length & ...
找到字符串中所有字母异位词
找到字符串中所有得到字母异位词给定两个字符串 s 和 p,找到 s 中所有 p 的
异位词
的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
示例 1:
12345输入: s = "cbaebabacd", p = "abc"输出: [0,6]解释:起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
示例 2:
123456输入: s = "abab", p = "ab"输出: [0,1,2]解释:起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。
提示:
1 ...
移动零
移动零给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
12输入: nums = [0,1,0,3,12]输出: [1,3,12,0,0]
示例 2:
12输入: nums = [0]输出: [0]
提示:
1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1
进阶:你能尽量减少完成的操作次数吗?
设置两个指针i和j,i从头开始遍历数组,如果nums[j]==0,j就应该停在这个位置,直到nums[i]!=0,此时把nums[i]覆盖nums[j],并且j前进一个位置,nums[i]的值改为0.
12345678910111213141516class Solution { public void moveZeroes(int[] nums) { // 0 1 0 3 12 for(int i =0,j=0;i<nums.length ...
最长连续序列
最长连续序列给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
示例 1:
123输入:nums = [100,4,200,1,3,2]输出:4解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
示例 2:
12输入:nums = [0,3,7,2,5,8,4,6,0,1]输出:9
提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109
第一次的做法是用一个哈希数组,<nums[i],出现次数>,问题就转化为了求数组的最长连续子序列长度。
没有注意nums[i]会有负数,所以错误.就算把nums[i]全部映射为正数,也会爆内存。
1234567891011121314151617181920212223class Solution { public int longestConsecutive(int[] nums) { int m ...
字母异位词分组
字母异位词分组给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
12输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
12输入: strs = [""]输出: [[""]]
示例 3:
12输入: strs = ["a"]输出: [["a"]]
提示:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i] 仅包含小 ...
赎金信
赎金信给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
示例 1:
12输入:ransomNote = "a", magazine = "b"输出:false
示例 2:
12输入:ransomNote = "aa", magazine = "ab"输出:false
示例 3:
12输入:ransomNote = "aa", magazine = "aab"输出:true
提示:
1 <= ransomNote.length, magazine.length <= 105
ransomNote 和 magazine 由小写英文字母组成
这题很像上一道有效字母的异位词。
使用哈希表记录ransomNote中每个字母出现的次数
遍历ma ...
两数之和
两数之和给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
示例 1:
123输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
12输入:nums = [3,2,4], target = 6输出:[1,2]
示例 3:
12输入:nums = [3,3], target = 6输出:[0,1]
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案
问题的关键是如何快速找到j,使得,nums[i]==target-nums[j].
使用哈希表,数组值作为k,对应下标作为v。遍历数组:
如果nums[i]作为下标在 ...
两个数组的交集
两个数组的交集给定两个数组 nums1 和 nums2 ,返回 它们的
交集
。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
示例 1:
12输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2]
示例 2:
123输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[9,4]解释:[4,9] 也是可通过的
提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
设置一个布尔数组,遍历数组1,将出现的数字标记为真。设置一个集合,遍历数组2,将布尔数组中为真的数加入集合
1234567891011121314151617181920class Solution { public int[] intersection(int[] nums1, int[] nums2) { boolean[] table = new boolean[ ...