896. 单调数列
如果数组是单调递增或单调递减的,那么它是单调的。
如果对于所有 i <= j,A[i] <= A[j],那么数组 A 是单调递增的。 如果对于所有 i <= j,A[i]> = A[j],那么数组 A 是单调递减的。
当给定的数组 A 是单调数组时返回 true,否则返回 false。
思路
1.这个题最直接的想法是:通过前两个数来判断整个数组的单调性质。但是如果前几个数都是一样的话,那么要找到第一个变化的位置。
2.因为在遍历过程中会遇到了两个数相等的情况,我们是不能简单地将相等纳入任何一边的。所以在遇到相等的情况的时候选择跳过。
完整代码
public boolean isMonotonic(int[] A) {
int flag = 0;
int k = 1;
while(k < A.length) {
if(A[k] == A[k - 1]) {
k++;
}else {
flag = (A[k] - A[k - 1] > 0) ? 1 : -1;
break;
}
}
for(int i = k; i < A.length; i++) {
if(A[i] == A[i - 1]) {
continue;
}
int temp = (A[i] - A[i - 1] > 0) ? 1 : -1;
if(flag != temp) {
return false;
}else {
continue;
}
}
return true;
}
新思路
在看题解的过程中,发现,一次遍历的最优解是在遍历过程中记录出有变化的情况:使用两个布尔变量,当发生递增时,将rise设置为true;当发生递减时,将down设置成true。遍历结束两个变量都为true时候。返回false。
public boolean isMonotonic(int[] A) {
boolean rise = false;
boolean down = false;
for(int i = 1; i < A.length; i++) {
if(A[i] < A[i - 1]) {
down = true;
}
if(A[i] > A[i - 1]) {
rise = true;
}
}
if(down && rise) {
return false;
}
return true;
}
395. 至少有 K 个重复字符的最长子串
给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于 k 。返回这一子串的长度。
思路
1.看到最长子串就想到了滑动窗口。但是在写代码的过程中发现不好实现。
2.想到统计字符的出现次数,如果有出现次数不符合要求的字符,可以用来划分字符串。
3.使用递归分治。返回字符串大小。
语法:
Spring.split():
1、若分隔符为“.”、“|”、“*”、“+”等转义字符时,直接使用str.split(".")会抛出异常,都必须在前面加"\",如split("\|");
2、如果用"“作为分隔,就得写成这样:String.split(”\\"),因为在Java中是用"\“来表示”"的,自定义字符串是这样的:String Str=“a\b\c”;
3、如果在一个字符串中有多个分隔符,可以用"|“作为连字符,比如:String str=“Java string-split#test”,可以用Str.split(” |-|#")把每个字符串分开;
4、split 方法的结果是一个字符串数组,在 stingObj 中每个出现 separator 的位置都要进行分解,separator不作为任何数组元素的部分返回。
完整代码
public int longestSubstring(String s, int k) {
if(s.length() < k) {
return 0;
}
Map<Character, Integer> map = new HashMap<>();//用来统计字符的出现次数
for(int i = 0; i < s.length(); i++) {
if(map.containsKey(s.charAt(i))) {
map.put(s.charAt(i), map.get(s.charAt(i)) + 1);
}else {
map.put(s.charAt(i), 1);
}
}
for(char ch : map.keySet()) {
if(map.get(ch) < k) {
int ans = 0;
for(String str : s.split(String.valueOf(ch))) {
ans = Math.max(ans, longestSubstring(str, k));
}
return ans;
}
}
return s.length();
}
867. 转置矩阵
给你一个二维整数数组 matrix, 返回 matrix 的 转置矩阵 。
矩阵的 转置 是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。
思路
这道题很简单,遍历的时候交换行列索引
完整代码
public int[][] transpose(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
int[][] ans = new int[n][m];
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
ans[j][i] = matrix[i][j];
}
}
return ans;
}