Day05_剑指Offer

时间:2021-08-16
本文章向大家介绍Day05_剑指Offer,主要包括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>

原文地址:https://www.cnblogs.com/sorrymaker/p/15149853.html