Java算法篇(一)

前言: 本篇博客是自己以一个星期为周期来记录的,周一到周五课程比较多,只能晚上来刷算法。加上还有其他事情,刷题时间不是特别多。周末的话还有其他的事情。如果本篇博客中存在错误,欢迎指导纠正,自己也是菜鸟水平,请多多包含!!!

一、替换空格

剑指offer:请实现⼀个函数,将⼀个字符串中的每个空格替换成“%20”

输入:We Are Happy

输出:We%20Are%20Happy

这里我采用了二种方法:① 常规方法; ② 使用 API 解决

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class Solution {
public static String replaceSpace(StringBuffer str){

int length = str.length();
// System.out.println("length="+length);
StringBuffer result = new StringBuffer();
for(int i = 0; i< length; i++){
char b = str.charAt(i);
if(String.valueOf(b).equals(" ")){
result.append("%20");
}else{
result.append(b);
}
}

return result.toString();
}

public static String replaceSpace2(StringBuffer str){
return str.toString().replaceAll("\\s","%20");
}

public static void main(String[] args) {
StringBuffer str = new StringBuffer("We Are Happy");
String s = Solution.replaceSpace(str);
String s1 = Solution.replaceSpace2(str);
System.out.println(s1);
}
}

输出结果:

image-20210515213711135

二、最长公共前缀

Leetcode: 编写⼀个函数来查找字符串数组中的最⻓公共前缀。如果不存在公共前缀,返回空字符串 “”。

示例 1:

1
2
输⼊: ["flower","flow","flight"]
输出: "fl"

示例 2:

1
2
3
输⼊: ["dog","racecar","car"]
输出: ""
解释: 输⼊不存在公共前缀。

结题思路:先利用Arrays.sort(strs)为数组排序,再将数组第一个元素和最后元素的字符从前往后对比即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
public class Main {

public static String replaceSpace(String[] strs){
// 如果检查值不合法及返回空串
if(!checkStr(strs)){
return "";
}

// 数组长度
int len = strs.length;
// 用于保存结果
StringBuilder res = new StringBuilder();
// 给字符串数组的元素按照升序排序(包含数字的话,数字会排在最前面)
Arrays.sort(strs);
int m = strs[0].length();
int n = strs[len - 1].length();
int num = Math.min(m,n);
for(int i = 0; i < num; i++){
if(strs[0].charAt(i) == strs[len -1].charAt(i)){
res.append(strs[0].charAt(i));
}else{
break;
}
}
return res.toString();
}

/**
* 检查输入值是否合法
* @param strs
* @return
*/
private static boolean checkStr(String[] strs){
boolean flag = false;
if(strs != null){
// 遍历strs检查元素值
for(int i=0; i <strs.length; i++){
if(strs[i] != null && strs[i].length() != 0){
flag = true;
}else{
flag = false;
break;
}
}
}

return flag;
}

public static void main(String[] args) {
String[] strs = { "customer", "car", "cat" };
// String[] strs = { "customer", "car", null };//空串
// String[] strs = {};//空串
// String[] strs = null;//空串
System.out.println(Main.replaceSpace(strs)); // c
}
}

三、回文串

1、最长回文串

LeetCode: 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构建过程中,请注意区分大小写。比如:“Aa” 不能当做一个回文串。注意: 假设字符串的长度不会超过1010。

回⽂串: “回⽂串”是⼀个正读和反读都⼀样的字符串,⽐如“level”或者“noon”等等就是回⽂串。

——百度百科 地址: https://baike.baidu.com/item/%E5%9B%9E%E6%96%87%E4%B8%B2/1274921?fr=aladdin

示例 1:

1
2
3
4
5
6
7
8
输⼊:
"abccccdd"

输出:
7

解释:
我们可以构造的最⻓的回⽂串是"dccaccd", 它的⻓度是 7。

构成回文串的两种情况:

  • 字符出现次数为双数的组合
  • 字符出现次数为双数的组合+一个值出现一次的字符

统计字符串出现的次数即可,双数才能构成回文。因为允许中间一个数单独出现,比如:“adcba”,所以如果最后有字母落单,总长度可以加1.首先将字符串转变为数组。然后遍历给数组,判断对应字符是否在hashset中,如果不在就加进去,如果在就让count++,然后移除该字符!这样就能找到出现次数为双数的字符个数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public  int longestPalindrome(String s){
if(s.length() == 0){
return 0;
}
// 用于存放字符
HashSet<Character> hashSet = new HashSet<>();
char[] chars = s.toCharArray();
int count = 0;
for(int i = 0; i < chars.length; i++){
// 如果hashset没有该字符就保存进去
if(!hashSet.contains(chars[i])){
hashSet.add(chars[i]);
}else{
// 如果有,就让count++(说明找到了一个成对的字符),然后把该字符移除
hashSet.remove(chars[i]);
count++;
}
}

return hashSet.isEmpty()?count * 2 : count * 2 +1;

}