目录
前言
双指针+字符串
一、给定一个数组将所有0,移动到末尾,但是其他数字顺序不动
package double_point2;
import java.util.Arrays;
/**
* Created with IntelliJ IDEA.
*
* @author : Future master
* @version : 1.0
* @Project : Java算法联系
* @Package : double_point2
* @ClassName : TestOne.java
* @createTime : 2021/10/31 17:57
* @Email : 2467636181@qq.com
* 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
*
* 示例:
*
* 输入: [0,1,0,3,12]
* 输出: [1,3,12,0,0]
*
* 来源:力扣(LeetCode)
* 链接:https://leetcode-cn.com/problems/move-zeroes
*/
public class TestOne {
public void moveZeroes(int[] nums) {
int len = nums.length-1;
int count = 0;
int i = 0;
while(i<=len){
if(nums[i]!=0){
nums[i-count] = nums[i];
}else{
count++;
}
i++;
}
while(count>0){
nums[len-count+1] = 0;
count--;
}
}
public static void main(String[] args) {
int[] nums = {0, 1, 0, 3, 12};
TestOne testOne = new TestOne();
testOne.moveZeroes(nums);
System.out.println(Arrays.toString(nums));
}
}
二、两数之和
package double_point2;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* Created with IntelliJ IDEA.
*
* @author : Future master
* @version : 1.0
* @Project : Java算法联系
* @Package : double_point2
* @ClassName : TestTwo.java
* @createTime : 2021/10/31 18:47
* @Email : 2467636181@qq.com
* 给定一个已按照 非递减顺序排列 的整数数组numbers ,请你从数组中找出两个数满足相加之和等于目标数target 。
*
* 函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。
*
* 你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
*
* 来源:力扣(LeetCode)
* 链接:https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted
*/
public class TestTwo {
public int[] twoSum(int[] numbers, int target) {
for(int i = 0,j = numbers.length-1;i<j;){//定义好双指针,并且规定出口
int add = numbers[i]+numbers[j];//定义两数之和
if(add == target){//出口,当和等于target的时候即为出口,并且一定含有这个出口
return new int[]{i+1,j+1};
}else if(add<target)i++;//当和小于目标值的时候即左指针应该向右移动
else j--;//否则右指针应该向左移动
}
return null;//若未找到出口则返回空值
// Map<Integer,Integer> map = new HashMap<>();
// int[] result = new int[2];
// for(int i = 0;i<numbers.length;i++){
// if(map.containsKey(target-numbers[i])){
// result[1] = i;
// result[0] = map.get(target-numbers[i]);
// }else{
// map.put(numbers[i],i);
// }
// }
// return result;
}
public static void main(String[] args) {
int[] numbers = {2, 7, 11, 15};
int target = 18;
TestTwo testTwo = new TestTwo();
int[] result = testTwo.twoSum(numbers,target);
System.out.println(Arrays.toString(result));
}
}
三、字符串操作
package double_point2;
import com.sun.source.tree.NewArrayTree;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
/**
* Created with IntelliJ IDEA.
*
* @author : Future master
* @version : 1.0
* @Project : Java算法联系
* @Package : double_point2
* @ClassName : TestThree.java
* @createTime : 2021/10/31 19:12
* @Email : 2467636181@qq.com
* 给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。
*
* 美式键盘 中:
*
* 第一行由字符 "qwertyuiop" 组成。
* 第二行由字符 "asdfghjkl" 组成。
* 第三行由字符 "zxcvbnm" 组成。
*
* 来源:力扣(LeetCode)
* 链接:https://leetcode-cn.com/problems/keyboard-row
*/
public class TestThree {
public String[] findWords(String[] words) {
String s1 = "qwertyuiopQWERTYUIOP";
String s2 = "asdfghjklASDFGHJKL";
String s3 = "zxcvbnmZXCVBNM";
List<String> list = new ArrayList<>();
for(String str:words){//对字符串数组进行遍历,如果字符串满足isContents中的条件则list添加该字符串
if(isContents(str,s1,s2,s3)){
list.add(str);
}
}
String[] result = new String[list.size()];
for(int i = 0;i<list.size();i++){//最后将ArrayList中的字符串全部赋值给新的字符串数组
result[i] = list.get(i);
}
return result;
}
private boolean isContents(String s,String s1,String s2,String s3){
String tmp = s3;//首先查看第一个字母为哪一行里面的字母
if(s1.contains(String.valueOf(s.charAt(0)))){
tmp = s1;
}else if(s2.contains(String.valueOf(s.charAt(0)))){
tmp = s2;
}
for(int i = 0;i<s.length();i++){//如果检查出来字符串中含有一个字母不是这一行的即返回false
if(!tmp.contains(String.valueOf(s.charAt(i))))return false;
}
return true;
}
public static void main(String[] args) {
String[] words = {"Hello", "Alaska", "Dad", "Peace"};
TestThree testThree = new TestThree();
String[] result = testThree.findWords(words);
System.out.println(Arrays.toString(result));
}
}