目录
4、关注公众号哪吒编程,回复1024,获取Java学习资料,还有不定期的送书活动
1、LeetCode 268.丢失的数字
题目
给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。
进阶:
你能否实现线性时间复杂度、仅使用额外常数空间的算法解决此问题?
小编菜解
private static int test01(int[] nums){
Arrays.sort(nums);
if (nums[0] != 0){
return 0;
}
if (nums[nums.length-1] != nums.length){
return nums.length;
}
int min = 0;
int max = nums.length;
for (int i = 0; i < max; i++) {
int next = nums[i]+1;
if (i+1 <max && nums[i+1]!=next){
return next;
}
}
return -1;
}
2、LeetCode 283.移动零
题目
给定一个数组
nums
,编写一个函数将所有0
移动到数组的末尾,同时保持非零元素的相对顺序。
小编菜解
private static void test02(int[] nums){
int[] temp = new int[nums.length];
int zeroNum = 0;
int notZeroNum = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i]!=0){
temp[notZeroNum] = nums[i];
notZeroNum++;
}else{
temp[nums.length - 1 - zeroNum] = 0;
zeroNum++;
}
}
}
思路及算法
使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。
右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。
注意到以下性质:
左指针左边均为非零数;
右指针左边直到左指针处均为零。
因此每次交换,都是将左指针的零与右指针的非零数交换,且非零数的相对顺序并未改变。
大佬指点江山
public static void moveZeroes(int[] nums) {
int n = nums.length, left = 0, right = 0;
while (right < n){
if (nums[right] != 0){
swap(nums,left,right);
left++;
}
right++;
}
}
public static void swap(int[] nums, int left, int right) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
大佬想的和我想的确实是不一样的。
3、LeetCode 290.单词规律
题目
给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。
小编菜解
public static boolean wordPattern(String pattern, String s) {
int pl = pattern.length();
String[] arr = s.split(" ");
int sl = arr.length;
if (pl!=sl){
return false;
}
Map<Character, String> map1 = new HashMap<Character, String>();
Map<String, Character> map2 = new HashMap<String, Character>();
for (int i = 0; i < pl; i++) {
if (!map1.containsKey(pattern.charAt(i))){
if (map2.containsKey(arr[i])){
return false;
}
map1.put(pattern.charAt(i),arr[i]);
map2.put(arr[i],pattern.charAt(i));
}else{
if(!map1.get(pattern.charAt(i)).equals(arr[i])){
return false;
}
}
}
return true;
}
大佬指点江山
public boolean wordPattern(String pattern, String str) {
Map<String, Character> str2ch = new HashMap<String, Character>();
Map<Character, String> ch2str = new HashMap<Character, String>();
int m = str.length();
int i = 0;
for (int p = 0; p < pattern.length(); ++p) {
char ch = pattern.charAt(p);
if (i >= m) {
return false;
}
int j = i;
while (j < m && str.charAt(j) != ' ') {
j++;
}
String tmp = str.substring(i, j);
if (str2ch.containsKey(tmp) && str2ch.get(tmp) != ch) {
return false;
}
if (ch2str.containsKey(ch) && !tmp.equals(ch2str.get(ch))) {
return false;
}
str2ch.put(tmp, ch);
ch2str.put(ch, tmp);
i = j + 1;
}
return i >= m;
}
第一次觉得自己写的比官方给的答案简单,思路居然是一样的,爱了爱了,我还特意在LeetCode提交了自己的答案,哈哈。
4、关注公众号哪吒编程,回复1024,获取Java学习资料,还有不定期的送书活动
- 数据结构和算法基础
- 人工智能数据基础与Python机器学习实战
- 机器学习数学基础
- node.js入门指南