字符串系
This commit is contained in:
parent
93cbd6955c
commit
92d8e06065
127
src/main/java/cn/whaifree/leetCode/Hash/LeetCode18.java
Normal file
127
src/main/java/cn/whaifree/leetCode/Hash/LeetCode18.java
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
package cn.whaifree.leetCode.Hash;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 18. 四数之和
|
||||||
|
|
||||||
|
* 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
|
||||||
|
* 0 <= a, b, c, d < n
|
||||||
|
* a、b、c 和 d 互不相同
|
||||||
|
* nums[a] + nums[b] + nums[c] + nums[d] == target
|
||||||
|
* 你可以按 任意顺序 返回答案 。
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 示例 1:
|
||||||
|
*
|
||||||
|
* 输入:nums = [1,0,-1,0,-2,2], target = 0
|
||||||
|
* 输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
|
||||||
|
* 示例 2:
|
||||||
|
*
|
||||||
|
* 输入:nums = [2,2,2,2,2], target = 8
|
||||||
|
* 输出:[[2,2,2,2]]
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* 提示:
|
||||||
|
*
|
||||||
|
* 1 <= nums.length <= 200
|
||||||
|
* -109 <= nums[i] <= 109
|
||||||
|
* -109 <= target <= 109
|
||||||
|
*
|
||||||
|
// 参考LeetCode15题
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class LeetCode18 {
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
// System.out.println(new Solution().fourSum(new int[]{1, 0, -1, 0, -2, 2}, 0));
|
||||||
|
System.out.println(1000000000+1000000000+1000000000+1000000000); // -294967296
|
||||||
|
int[] nums = {1000000000,1000000000,1000000000,1000000000};
|
||||||
|
int target = -294967296;
|
||||||
|
List<List<Integer>> expected = new ArrayList<>();
|
||||||
|
expected.add(Arrays.asList(2, 5, 6, 7));
|
||||||
|
expected.add(Arrays.asList(3, 4, 6, 7));
|
||||||
|
expected.add(Arrays.asList(3, 5, 6, 6));
|
||||||
|
System.out.println(new Solution().fourSum(nums, target));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO 没完全做出来
|
||||||
|
* 和LeetCode 15题类似,但需要考虑 2 2 2 2 2 target=8 这样去重的情况
|
||||||
|
*/
|
||||||
|
class Solution {
|
||||||
|
public List<List<Integer>> fourSum(int[] nums, int target) {
|
||||||
|
|
||||||
|
Arrays.sort(nums);
|
||||||
|
|
||||||
|
List<List<Integer>> lists = new ArrayList<>();
|
||||||
|
|
||||||
|
// 第一个数>0,并且>目标值,递增的数组,一定为空
|
||||||
|
/**
|
||||||
|
* int[] nums = {1000000000,1000000000,1000000000,1000000000};
|
||||||
|
* int target = -294967296;
|
||||||
|
* 不加这段代码,这个用例会报错
|
||||||
|
* System.out.println(1000000000+1000000000+1000000000+1000000000); // -294967296
|
||||||
|
* 因为: -109 <= nums[i] <= 109
|
||||||
|
* -109 <= target <= 109
|
||||||
|
*/
|
||||||
|
if (nums[0] > 0 && nums[0] > target) {
|
||||||
|
return lists;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < nums.length - 3; i++) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// TODO 保证能够进入一次循环 i>0
|
||||||
|
if (i > 0 && nums[i] == nums[i - 1]) {
|
||||||
|
// 去重
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (int j = i + 1; j < nums.length - 2; j++) {
|
||||||
|
|
||||||
|
if (j > i + 1 && nums[j] == nums[j - 1]) {
|
||||||
|
// 这里需要考虑这样一种情况 [-2, -1, 0, 0, 1, 2] 如果用nums[j] == num[j + 1] 判断 -2 0 0 2 这种会被忽略
|
||||||
|
// 去重可以考虑向前或者向后去重,注意<p>去重是要让指针和已经指过的对比</p>
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int left = j + 1;
|
||||||
|
int right = nums.length - 1;
|
||||||
|
|
||||||
|
while (left < right) {
|
||||||
|
int sum = nums[right] + nums[left] + nums[i] + nums[j];
|
||||||
|
if (sum > target) {
|
||||||
|
right--;
|
||||||
|
} else if (sum < target) {
|
||||||
|
left++;
|
||||||
|
} else {
|
||||||
|
lists.add(Arrays.asList(nums[right], nums[left], nums[i], nums[j]));
|
||||||
|
while (left != right && nums[left] == nums[left + 1]) {
|
||||||
|
left++;
|
||||||
|
}
|
||||||
|
while (left != right && nums[right] == nums[right - 1]) {
|
||||||
|
right--;
|
||||||
|
}
|
||||||
|
right--;
|
||||||
|
left++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return lists;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
81
src/main/java/cn/whaifree/leetCode/String/LeetCode151.java
Normal file
81
src/main/java/cn/whaifree/leetCode/String/LeetCode151.java
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
package cn.whaifree.leetCode.String;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
|
public class LeetCode151 {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
String s = " the sky is blue";
|
||||||
|
|
||||||
|
|
||||||
|
char[] chars = new Solution1().deleteSpace(s.toCharArray());
|
||||||
|
for (char aChar : chars) {
|
||||||
|
System.out.println("=" + aChar + "=");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Solution {
|
||||||
|
public String reverseWords(String s) {
|
||||||
|
List<String> list = new LinkedList<>();
|
||||||
|
String[] split = s.split(" ");
|
||||||
|
for (String s1 : split) {
|
||||||
|
if (!(s1.equals("") || s1.equals(" "))) {
|
||||||
|
list.add(s1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
StringBuilder buffer = new StringBuilder();
|
||||||
|
int index = list.size() - 1;
|
||||||
|
while (index > 0) {
|
||||||
|
buffer.append(list.get(index--)+" ");
|
||||||
|
}
|
||||||
|
buffer.append(list.get(0));
|
||||||
|
return buffer.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 不要使用辅助空间,空间复杂度要求为O(1)
|
||||||
|
class Solution1 {
|
||||||
|
public String reverseWords(String s) {
|
||||||
|
char[] chars = s.toCharArray();
|
||||||
|
// 移除多余空格
|
||||||
|
// 反转char
|
||||||
|
// 反转每个字符
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public char[] deleteSpace(char[] chars) {
|
||||||
|
|
||||||
|
int superFlowSpace = 0;
|
||||||
|
|
||||||
|
int index = 0;
|
||||||
|
System.out.println(chars[index] == ' ');
|
||||||
|
while (chars[index] == ' ') {
|
||||||
|
superFlowSpace++;
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
index = 0;
|
||||||
|
while (index < chars.length - 1 - superFlowSpace) {
|
||||||
|
chars[index] = chars[index + superFlowSpace];
|
||||||
|
if (' ' == chars[index + superFlowSpace] && ' ' == chars[index + superFlowSpace + 1]) {
|
||||||
|
superFlowSpace++;
|
||||||
|
} else {
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return Arrays.copyOfRange(chars, 0, chars.length - superFlowSpace);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
40
src/main/java/cn/whaifree/leetCode/String/LeetCode344.java
Normal file
40
src/main/java/cn/whaifree/leetCode/String/LeetCode344.java
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
package cn.whaifree.leetCode.String;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class LeetCode344 {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
char[] s = "helco1".toCharArray();
|
||||||
|
new Solution().reverseString(s);
|
||||||
|
for (char c : s) {
|
||||||
|
System.out.println(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Solution {
|
||||||
|
|
||||||
|
|
||||||
|
public void reverseString(char[] s) {
|
||||||
|
// for (int i = 0; i < s.length / 2; i++) {
|
||||||
|
// char tmp = s[i];
|
||||||
|
// s[i] = s[s.length - i - 1];
|
||||||
|
// s[s.length - i - 1] = tmp;
|
||||||
|
// }
|
||||||
|
|
||||||
|
int left = 0;
|
||||||
|
int right = s.length - 1;
|
||||||
|
while (left < right) {
|
||||||
|
char tmp = s[left];
|
||||||
|
s[left] = s[right];
|
||||||
|
s[right] = tmp;
|
||||||
|
left++;
|
||||||
|
right--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
37
src/main/java/cn/whaifree/leetCode/String/LeetCode541.java
Normal file
37
src/main/java/cn/whaifree/leetCode/String/LeetCode541.java
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
package cn.whaifree.leetCode.String;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class LeetCode541 {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
String s = "1234567890";
|
||||||
|
int k = 4;
|
||||||
|
System.out.println(new Solution().reverseStr(s, k));
|
||||||
|
}
|
||||||
|
|
||||||
|
class Solution {
|
||||||
|
public String reverseStr(String s, int k) {
|
||||||
|
char[] chars = s.toCharArray();
|
||||||
|
for (int i = 0; i < chars.length; i = i + k * 2) {
|
||||||
|
reverse(chars, i, i + k - 1);
|
||||||
|
}
|
||||||
|
return new String(chars);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reverse(char[] chars, int start, int end) {
|
||||||
|
// 边界判断, 如果要逆转的区间越界,就把后面这一段都逆转了,取最大值就好了
|
||||||
|
if (end > chars.length - 1) {
|
||||||
|
end = chars.length - 1;
|
||||||
|
}
|
||||||
|
while (start < end) {
|
||||||
|
char tmp = chars[start];
|
||||||
|
chars[start] = chars[end];
|
||||||
|
chars[end] = tmp;
|
||||||
|
start++;
|
||||||
|
end--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user