21/02/28刷题记录Day9

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;

    }

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42180334/article/details/114223504