一、leetcode题目
1.所有子字符串美丽值之和
题目描述
一个字符串的 美丽值 定义为:出现频率最高字符与出现频率最低字符的出现次数之差。
比方说,"abaacc"
的美丽值为 3 - 1 = 2
。
给你一个字符串 s
,请你返回它所有子字符串的 美丽值 之和。
2.测试用例
输入:
s = “aabcb”
输出:
5
解释:
美丽值不为零的字符串包括 [“aab”,“aabc”,“aabcb”,“abcb”,“bcb”] ,每一个字符串的美丽值都为 1 。
提示
- 1 <= s.length <= 500
s
只包含小写英文字母。
3.思路
数据量小,直接暴力模拟咯
4.算法实现
class Solution {
public int beautySum(String s) {
int res = 0;
for (int i = 0; i < s.length(); i++) {
int[] cnt = new int[26];
int maxFreq = 0;
for (int j = i; j < s.length(); j++) {
cnt[s.charAt(j) - 'a']++;
maxFreq = Math.max(maxFreq, cnt[s.charAt(j) - 'a']);
int minFreq = s.length();
for (int k = 0; k < 26; k++) {
if (cnt[k] > 0) {
minFreq = Math.min(minFreq, cnt[k]);
}
}
res += maxFreq - minFreq;
}
}
return res;
}
}
二、蓝桥题目
1.百亿富翁
题目描述
这天小明买彩票中了百亿奖金,兴奋的他决定买下蓝桥公司旁的一排连续的楼房。
已知这排楼房一共有 N N N 栋,编号分别为 1 ∼ N 1\sim N 1∼N,第 ii 栋的高度为 h i h_i hi。
好奇的小明想知道对于每栋楼,左边第一个比它高的楼房是哪个,右边第一个比它高的楼房是哪个(若不存在则输出 -1−1)。但由于楼房数量太多,小明无法用肉眼直接得到答案,于是他花了 11 个亿来请你帮他解决问题,你不会拒绝的对吧?v
输入描述
第
1
1
1 行输入一个整数
N
N
N,表示楼房的数量。
第 2 2 2 行输入 N N N 个整数(相邻整数用空格隔开),分别为 h 1 , h 2 , . . . , h N h_1,h_2,...,h_N h1,h2,...,hNh ,表示楼房的高度。
1 ≤ N ≤ 7 × 1 0 5 1 \leq N \leq 7\times 10^5 1≤N≤7×105, 1 ≤ h i ≤ 1 0 9 1\leq h_i \leq 10^9 1≤hi≤109。
输出描述
输出共两行。
第一行输出 N N N 个整数,表示每栋楼左边第一栋比自己高的楼的编号。
第二行输出 N N N 个整数,表示每栋楼右边第一栋比自己高的楼的编号。
2.测试用例
输入:
5
3 1 2 5 4
输出:
-1 1 1 -1 4
4 3 4 -1 -1
3.思路
一眼单调栈。
4.算法实现
import java.util.Scanner;
import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
int n = scan.nextInt();
int[] arr = new int[n+1];
for(int i = 1; i < n; i++){
arr[i] = scan.nextInt();
}
Deque<Integer> stack = new LinkedList<>();
for(int i = 1; i <= n; i++){
while(!stack.isEmpty() && arr[stack.peekLast()] < arr[i]){
stack.removeLast();
}
if(stack.isEmpty()) System.out.print(-1+" ");
else System.out.print(stack.peekLast()+" ");
stack.addLast(i);
}
System.out.println();
stack.clear();
int[] ans = new int[n+1];
for(int i = n; i >= 1; i--){
while(!stack.isEmpty() && arr[stack.peekLast()] < arr[i]){
stack.removeLast();
}
if(stack.isEmpty()) ans[i] = -1;
else ans[i] = stack.peekLast();
stack.addLast(i);
}
for(int i = 1; i <= n; i++){
System.out.print(ans[i]+" ");
}
scan.close();
}
}