1023. 驼峰式匹配

1023. 驼峰式匹配

题目:

1023

思路

  • 题目可以解释为:遍历queries中的每个query,根据每个字符是否是大小写、是否与pattern对比相同进行筛选
  • 以第一个为例子:
    • 遍历FooBar[i],如果与pattern[j++]相等,继续
    • 如果不相等且不是小写字母,那么为false,直接break
    • 如果FooBar遍历完后,patter中还有未比对字符,也是false,直接break
    • 顺利执行完遍历,并且pattern中字符没有对比剩余,那么便返回true

参考代码

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
public static List<Boolean> camelMatch(String[] queries, String pattern) {
int flag = 0;
List<Boolean> res = new ArrayList<Boolean>();
for(String query : queries){
int j = 0;
for(int i = 0; i < query.length(); i++){
if(j < pattern.length()){
if(query.charAt(i) == pattern.charAt(j)){
j++;
}else{
if(!(query.charAt(i) >= 'a' && query.charAt(i) <= 'z')){
flag = 1;
res.add(false);
break;
}

}
}else{
if(query.charAt(i) >= 'A' && query.charAt(i) <= 'Z'){
res.add(false);
flag = 1;
break;
}
}
}
if(flag == 0){
if(j >= pattern.length()){
res.add(true);
}else{
res.add(false);
}
}
flag = 0;
}
return res;
}

2404. 出现最频繁的偶数元素

2404. 出现最频繁的偶数元素

题目

  • 给你一个整数数组 nums ,返回出现最频繁的偶数元素。如果存在多个满足条件的元素,只需要返回 最小 的一个。如果不存在这样的元素,返回 -1

思路

  • 最终返回元素条件如下:
    • 必须是偶数(num % 2 == 0)
    • 出现次数最多
    • 出现次数最多中值最小

解答代码

  • ans代表出现次数
  • resNum表示最终元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public int mostFrequentEven(int[] nums) {
int res[] = new int[100001];
int ans = -1;
int resNum = 100001;
for(int i = 0; i < nums.length; i++){
if(nums[i] % 2 == 0){
res[nums[i]]++;
if(res[nums[i]] > ans){
ans = res[nums[i]];
resNum = nums[i];
}
if(res[nums[i]] == ans){
ans = res[nums[i]];
if(nums[i] < resNum){
resNum = nums[i];
}
}
}
}
if(ans == -1){
return -1;
}
return resNum;
}

592.分数加减运算

592. 分数加减运算

*难度中等**

题目描述

1.jpg

解题思路

  • 根据分数的计算方法,使用最原始的方法进行计算,最后进行化简即可
  • 那么最原始的方法就是根据以下公式

2.jpg

  • 那么,设计所需要做的就是:
  1. 先将给定的字符串按照要求提出分子和分母并将其转化为整数,
  2. 将给定的“+”和减号“-”带入分子之中,即加号则分子为正,减号则分子为负
  3. 获取分母乘积之和
  4. 将分子*分母乘积之和/分母,并获得分子相加之和
  5. 通过最大公约数进行化简,得出最终结果

参考代码

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
class Solution {
//求取最大公约数
public int gcd(int x, int y){
if(y != 0){
return gcd(y, x%y);
}else{
return x;
}
}
// i 分子,j 分母,k 符号
public String fractionAddition(String expression) {
// 用于计算最后一项,即j+1,保证存在
expression = expression + "+";
int len = expression.length();
//存储分母
int[] down = new int[11];
//存储分子
int[] up = new int[11];
// 分母乘积之和
int sum = 1;
int cnt = 0;
//Set<Integer> down = new HashSet<>();
int i = 0, j = 0, k = 0;
int flag = 0;
// 开头有无减号,分类讨论
if(expression.charAt(0) == '-'){
i = 1;
j = 3;
k = 0;
}else{
i = 0;
j = 2;
k = 3;
flag = 1;
}

int num1 = 0, num2 = 1;
while( i < len && j < len && k < len){
// 获取符号
char ch = ' ';
if(flag == 1){
ch = '+';
k = -1;
flag = 0;
}else{
ch = expression.charAt(k);
}
//System.out.println("---"+expression.substring(i+1,i+2));
//如果分子为10,占据2个长度,需要进行判断并将i+1, j+1, k+1保证后续循环还能继续找到对应位置
if(expression.charAt(i+1) != '/'){
num1 = 10;
i++;
j++;
k++;
}else{
num1 = Integer.parseInt(expression.substring(i, i + 1));
}
//System.out.println("j+1: "+expression.charAt(j+1));
// 分母同理。不过要注意最后于一项
if(expression.charAt(j+1) != '+' && expression.charAt(j+1) != '-'){
num2 = 10;
i++;
j++;
k++;
}else {
num2 = Integer.parseInt(expression.substring(j, j + 1));
}
if(ch == '-'){
num1 = 0-num1;
}
//out.println("num1: "+num1);
//System.out.println("num2: "+num2);
up[cnt] = num1;
down[cnt++] = num2;
sum = sum * num2;
//dwon.add(num2);
// 加4获得下一项对应位置
i = i+4;
j = j+4;
k = k+4;
}
// 分子相加之和
int resUp = 0;
for(int a = 0; a < cnt; a++){
resUp += up[a] * (sum / down[a]);
}
//System.out.println("---"+sum);
//System.out.println("---"+resUp);
// 获取最大公约数
int g = gcd(resUp, sum);
if(g < 0)
g = 0-g;
return resUp/g + "/" + sum/g;
}
}

PS: 不一定最好的,因为做完的时候已经23:57了~_~

每日一图

3.jpg

1184-公交站间的距离

1184:公交站间的距离

题目介绍

vSPL7Q.png

解题思路

  • 这是一道简单的题
  • 由于公交车只能顺时针或逆时针移动,而且所有点的移动顺序是固定的,例如从1到3的顺序就只有1,2,3或是倒着走,因为其他方式的路程无疑会更长
  • 所以只需要计算全部路程的长度和其顺序走或逆序走的路程数,然后选择较小的数值就是最短距离

参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public int distanceBetweenBusStops(int[] distance, int start, int destination) {
int sum = 0;
int part1 = 0;
if(start > destination){
int tmp = start;
start = destination;
destination = tmp;
}
for(int i = 0; i < distance.length; i++){
sum += distance[i];
}
for(int i = start; i < destination; i++){
part1 += distance[i];
}
if(sum - part1 < part1){
return sum-part1;
}else{
return part1;
}
}
}

简单的一题!!!

[1.jpg