Day05_剑指Offer
Day05_剑指Offer
链接里面都是辅导性的图,一看就会做了,加油,你行的。
package com.sorrymaker.day2905;
import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
/**
* 在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。
* @Author nextGame
* @Date 2021/8/16 20:09
* @Version 1.0
*/
public class FirstUniqChar {
public char firstUniqChar(String s) {
HashMap<character,boolean> dic = new HashMap<>();
char[] sc = s.toCharArray();
for(char c : sc) {
//遍历s字符串的每个字符,存储下来出现的了第几遍,当出现第一遍的时候是true,出现第二遍就会变成false了。
dic.put(c,!dic.containsKey(c) );
}
//再遍历一遍字符串,dic 里面遇到true ,就直接返回C。
for(char c : sc) {
if(dic.get(c)){
return c;
}
}
return ' ';
}
}
package com.sorrymaker.day2905;
import org.junit.Test;
/**
* 在一个 n * m 的二维数组中,
* 每一行都按照从左到右递增的顺序排序,
* 每一列都按照从上到下递增的顺序排序。
* 请完成一个高效的函数,输入这样的一个二维数组和一个整数,
* 判断数组中是否含有该整数。
* @Author nextGame
* @Date 2021/8/16 19:09
* @Version 1.0
*/
public class FindNumberIn2DArray {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
//这个是一个二维递增的数组。所以这样子处理后,是没问题的。
//i 是列,j是行。
int i = matrix.length-1, j=0;
while (i>=0 && j<matrix[0].length){ 这里成立的话,就要把行--。="" if(matrix[i][j]=""> target){
i--;
//这里成立的话,就要把列--。
}else if(matrix[i][j] <target ){="" j++;="" }else{="" return="" true;="" }="" false;="" ```="" ```java="" package="" com.sorrymaker.day2905;="" import="" org.junit.test;="" **把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。="" *="" 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。="" 例如,数组="" [3,4,5,1,2]="" 为="" [1,2,3,4,5]="" 的一个旋转,该数组的最小值为1。="" 这道题还是用到二分法。~~!!="" @author="" nextgame="" @date="" 2021="" 8="" 16="" 19:22="" @version="" 1.0="" public="" class="" minarray="" {="" int="" minarray(int[]="" numbers)="" 这里的数组是递增排序的数组(处理中间有个最小值,需要我们旋转数据,找到最小值)。="" i为左边界,="" j为右边界。="" i="0,j=" numbers.length-1;="" while="" (i<j){="" m="(i+j)/2;" 这下面的逻辑="" 当m索引上的值大于j索引的值,左边界到m肯定不会有最小值,="" if(numbers[m]="">numbers[j]){
//所以这里i = m+1 ; 提高效率。
i=m+1;
//当m所以的值小于 索引j的值,说明 要么m的位置为最小值,要么就是左边界到m之间存在最小值
//即是 [i , m] 。i到m之间存在最小值。
}else if(numbers[m]</target></matrix[0].length){></character,boolean>

浙公网安备 33010602011771号