首页 > 编程语言 >算法训练——剑指offer(模拟算法)

算法训练——剑指offer(模拟算法)

时间:2023-04-04 14:04:36浏览次数:53  
标签:right return bottom int top offer 算法 模拟 left


摘要

一、模拟算法原理与解题方法

二、模拟算法练习题目

2.1 顺时针打印矩阵

顺时针打印矩阵_牛客题霸_牛客网

解题思路:

递归的思想和非递归的思想相差不大,递归是首先打印最外层的元素,将内层的矩阵作为一个全新的矩阵进行递归。对于每层,从左上方开始以顺时针的顺序遍历所有元素。假设当前层的左上角位于 (top,left),右下角位于(bottom,right),按照如下顺序遍历当前层的元素。

1、从左到右遍历上侧元素,依次为(top,left) 到(top,right)。
2、从上到下遍历右侧元素,依次为(top+1,right) 到 (bottom,right)。
3、如果 left<right 且top<bottom,则从右到左遍历下侧元素,依次为(bottom,right−1) 到 (bottom,left+1),以及从下 到上遍历左侧元素,依次为(bottom,left) 到(top+1,left)。
遍历完当前层的元素之后,将left 和top 分别增加 1,将 right 和 bottom 分别减少 11,进入下一次递归,直到遍历完所有元素为止。

算法训练——剑指offer(模拟算法)_递归

package 模拟算法;

import java.util.ArrayList;

/**
 * @Classname JZ29顺时针打印矩阵
 * @Description TODO
 * @Date 2022/2/5 13:46
 * @Created by xjl
 */
public class JZ29顺时针打印矩阵 {
    ArrayList<Integer> res = new ArrayList<>();

    public ArrayList<Integer> printMatrix(int[][] matrix) {
        if (matrix == null || matrix.length == 0) {
            return res;
        }
        int m = matrix.length;
        int n = matrix[0].length;

        print(0, n - 1, 0, m - 1, matrix);
        return res;
    }

    public void print(int left, int right, int top, int bottom, int[][] matrix) {
        // 从左到右
        for (int i = left; i <= right; i++) {
            res.add(matrix[top][i]);
        }
        // 下一层
        top++;
        if (left > right || top > bottom) {
            return;
        }
        // 从上到下
        for (int i = top; i <= bottom; i++) {
            res.add(matrix[i][right]);
        }
        right--;
        if (left > right || top > bottom) {
            return;
        }
        // 从右到左
        for (int i = right; i >= left; i--) {
            res.add(matrix[bottom][i]);
        }
        bottom--;
        if (left > right || top > bottom) {
            return;
        }
        // 从下到上
        for (int i = bottom; i >= top; i--) {
            res.add(matrix[i][left]);
        }
        left++;
        // 递归
        print(left, right, top, bottom, matrix);
    }

}

2.2 扑克牌的顺子

扑克牌顺子_牛客题霸_牛客网1

1. 除0外没有重复的数

2. max - min < 5

package 模拟算法;

import org.junit.Test;

import java.util.Arrays;

/**
 * @Classname JZ61扑克牌顺子
 * @Description TODO
 * @Date 2022/2/5 15:53
 * @Created by xjl
 */
public class JZ61扑克牌顺子 {
    /**
     * @description 判断什么是顺子
     * 1 除0外没有重复的数据
     * <p>
     * 2  max - min < 5
     * @param: numbers
     * @date: 2022/2/5 15:59
     * @return: boolean
     * @author: xjl
     */
    public boolean IsContinuous(int[] numbers) {
        Arrays.sort(numbers);
        int index = 0;
        while (numbers[index] == 0) {
            index++;
        }
        for (int i = index + 1; i < numbers.length; i++) {
            if (numbers[i] == numbers[i - 1]) {
                return false;
            }
        }
        if (numbers[numbers.length - 1] - numbers[index] > 4) {
            return false;
        }
        return true;
    }

    @Test
    public void test() {
        int[] array={3,0,0,0,0};
        boolean b = IsContinuous(array);

    }
}

2.3 把字符转换为整数

把字符串转换成整数(atoi)_牛客题霸_牛客网

package 模拟算法;

/**
 * @Classname JZ67把字符串转换成整数
 * @Description TODO
 * @Date 2022/2/5 16:20
 * @Created by xjl
 */
public class JZ67把字符串转换成整数 {

    public int StrToInt(String s) {
        //给定的字符串长度
        int len = s.length();
        if (len == 0) {
            return 0;
        }
        //默认为正数
        int sign = 1;
        long num = 0;
        int i = 0;

        //直到找到第一个非空格字符
        while (i < len && s.charAt(i) == ' ') {
            i++;
        }

        if (i < len) {
            //第一个非空格字符是负号
            if (s.charAt(i) == '-') {
                //修改sign,表明为负数
                sign = -1;
                i++;//定位到下一个字符
            } else if (s.charAt(i) == '+') {
                //第一个非空格字符是正号
                i++;
            }
        }

        //非正负号,则进入下面while循环的处理
        while (i < len) {
            if (s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                num = num * 10 + (s.charAt(i) - '0');
                if (sign == -1 && num * (-1) < Integer.MIN_VALUE) {
                    return Integer.MIN_VALUE;
                }
                /*
                 * 注意如果上面与逻辑后写的是num>(-1)*Integer.MIN_VALUE,结果是错的,经测试(-1)*Integer.MIN_VALUE结果
                 * 仍为Integer.MIN_VALUE,原因溢出
                 */
                else if (sign == 1 && num > Integer.MAX_VALUE) {
                    return Integer.MAX_VALUE;
                }
                i++;
            } else {
                break;//不是有效数字}
            }
        }

        int res = (int) num;//返回值要求是int,所以需要做一个强制类型转换
        res *= sign;//带上它的符号
        return res;
    }

}

2.4 表示数值的字符串

表示数值的字符串_牛客题霸_牛客网

package 模拟算法;

import org.junit.Test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @Classname JZ20表示数值的字符串
 * @Description TODO
 * @Date 2022/2/5 17:08
 * @Created by xjl
 */
public class JZ20表示数值的字符串 {
    public boolean isNumeric(String str) {
        if (str.indexOf('.') != str.lastIndexOf('.')) {
            return false;
        }
        String pattern = "^\\s*[+-]?[.]?\\d+([.]\\d*)?([Ee][+-]?\\d+)?\\s*$";
        Pattern p = Pattern.compile(pattern);
        Matcher matcher = p.matcher(str);
        return matcher.matches();
    }

    public boolean isNumeric2(String str) {
        if (str == "e") {
            return false;
        }
        try {
            Float.valueOf(str);
        } catch (Exception e) {
            return false;
        }
        return true;
    }

    @Test
    public void test() {
        boolean numeric = isNumeric("123.45e+6");
        System.out.println(numeric);
    }
}

博文参考

标签:right,return,bottom,int,top,offer,算法,模拟,left
From: https://blog.51cto.com/u_13643065/6168620

相关文章

  • 算法训练——剑指offer(排序算法)摘要
    摘要一、排序算法原理与解题方法二、排序算法练习题目2.1数组中重复的数字数组中重复的数字_牛客题霸_牛客网package排序算法;importjava.util.ArrayList;/***@ClassnameJZ3数组中重复的数字*@DescriptionTODO*@Date2022/2/49:20*@Createdbyxjl*/publi......
  • 算法从入门到精通:选择排序
    一、排序和算法排序是算法中的一部分,也叫排序算法。算法一般用来处理数据,而数据的处理最好是要找到他们的规律,这个规律中有很大一部分就是要进行排序,所以需要有排序算法。本节讲解的是选择排序,从选择排序开始认识排序的一些基础概念。之所以将选择排序作为排序的入门,原因是选择排......
  • 数学建模(三):模拟退火算法(SA)
    目录模拟退火算法(SA)一、概述1、算法简介2、核心思想3、数学原理4、模拟退火的流程二、实例分析1、初始化参数2、Metrospolis准则3、生成新的值4、获取最优值5、主程序6、总代码模拟退火算法(SA)一、概述1、算法简介模拟退火算法(simulatedannealing,SA)来源于固体......
  • 力扣---剑指 Offer 41. 数据流中的中位数
    如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。例如,[2,3,4] 的中位数是3[2,3]的中位数是(2+3)/2=2.5设计一个支持以下......
  • golang CVE-2016-2183漏洞,https需要添加tls设置加密算法CipherSuites白名单,将弱加密算
    golangCVE-2016-2183漏洞,https需要添加tls设置加密算法白名单,将弱加密算法DES和3DES去掉。服务端样例代码packagemainimport("crypto/tls""fmt""net/http")funchandler(writerhttp.ResponseWriter,request*http.Request){fmt.Fprintf(wri......
  • 开源不到 48 小时获 35k star 的推荐算法「GitHub 热点速览」
    开源不到48小时获35kstar的推荐算法「GitHub热点速览」 本周的热点除了GPT各类衍生品之外,还多了一个被马斯克预告过、在愚人节开源出来的推特推荐算法,开源不到2天就有了35k+的star,有意思的是,除了推荐算法本身之外,阅读源码的工程师们甚至看到了员工对马斯克的特......
  • BFGS算法中的SWM公式应用
    BFGS算法矩阵$B_k$的迭代公式为:$$B_{k+1}=B_k+\frac{y_ky_k^T}{y_k^T\delta_k}-\frac{B_k\delta_k\delta_k^TB_k}{\delta_k^TB_k\delta_k}$$Sherman-Morrison公式为:假设A是n阶可逆矩阵,t为常量,u,v是n维向量,且$A+uv^T$也是可逆矩阵,则$$(A+\frac{uv^T}{t})^{-1}=A^{......
  • 树:剑指 Offer 37. 序列化二叉树
    题目描述:请实现两个函数,分别用来序列化和反序列化二叉树。你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列/反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。提示:输入输出格式与LeetCo......
  • 【初赛】各种排序算法总结
    一、算法评价排序方法平均时间最好时间最坏时间冒泡排序(稳定)O(n^2)O(n)O(n^2)选择排序(不稳定)O(n^2)O(n^2)O(n^2)插入排序(稳定)O(n^2)O(n)O(n^2)快速排序(不稳定)O(nlogn)O(nlogn)O(n^2)归并排序(稳定)O(nlogn)O(nlogn)O(nlogn)堆排序(不稳定)O(nlogn)O(nlogn)O(nlogn)基数排序......
  • IdWorker 雪花算法生成id
    packageentity;importjava.lang.management.ManagementFactory;importjava.net.InetAddress;importjava.net.NetworkInterface;/***<p>名称:IdWorker.java</p>*<p>描述:分布式自增长ID</p>*<pre>*Twitter的SnowflakeJAVA实现方案......