Java算法总结

文章目录

  • 一、链表相关
    • 1.1 从尾到头打印单链表[要求 方式1:反向遍历。方式2:Stack栈]
    • 1.2 josephu问题(使用带尾指针的循环链表)
  • 二、动态规划
    • 2.1 斐波那契数列 2022.4.18
    • 2.2 青蛙上台阶 2022.4.18
  • 三、位运算符
    • 3.1 二进制中1的个数 2022.4.18
  • 四、回溯算法
    • 4.1 打印从1到最大的n位数 2022.4.18
  • 五、双指针
    • 5.1 单链表反转 2022.4.18
    • 5.2 链表中倒数第k个节点 2022.4.18

一、链表相关

1.1 从尾到头打印单链表[要求 方式1:反向遍历。方式2:Stack栈]

// 上面的题的要求就是逆序打印单链表// 方式1:先将单链表进行反转操作,然后再遍历即可,这样做的问题就是会破坏原来的单链表的结构,不建议// * 方式2:可以利用栈这个数据结构,将各个结点压入栈中,然后利用栈的先进后出的特点,就实现了逆序打印public void printReverseLinkList() {if (head.next == null) return;Stack<T> stack = new Stack<>();// 遍历压栈Node<T> cur = head.next;while (cur != null) {stack.push(cur.getData());cur = cur.next;}// 出栈打印while (stack.size() > 0) {System.out.println(stack.pop());}}

1.2 josephu问题(使用带尾指针的循环链表)

package com.gyh.Link;import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;/*** @author Gao YongHao* @version 1.0*/
public class SingleCircularLinkedListDemo {public static void main(String[] args) {SingleCircularLinkedList<Integer> integerSingleCircularLinkedList = new SingleCircularLinkedList<>();for (int i = 0; i < 10; i++) {integerSingleCircularLinkedList.add(i);}List<Integer> josephu = integerSingleCircularLinkedList.josephu(4, 6);josephu.forEach(System.out::println);}
}/*** 1. 创建尾结点* 2. 每次定位至数到 m 的结点的上一个结点位置(只有这样才可以更新信息)** @param <T>*/
class SingleCircularLinkedList<T> {// 不设置头结点(设置指向尾元素的指针)private Node<T> last;// 判断空public boolean isEmpty() {return last == null;}// 添加数据public void add(T d) {// 为空则直接创建if (isEmpty()) {last = new Node<>(d, null);last.setNext(last);return;}last.next = new Node<T>(d, last.next);last = last.next;}// 链表长度public int getLength() {// 为空则返回if (isEmpty()) return 0;int n = 1;Node<T> cur = last.next;while (cur != last) {n++;cur = cur.next;}return n;}// 约瑟夫问题public List<T> josephu(int k, final int m) {// 1 <= k <= nint n = getLength();assert k >= 1 && k <= n;if (n == 1) return Collections.singletonList(last.getData());// 循环出值List<T> out = new ArrayList<>();// pre初始为最后一个元素Node<T> pre = last;// 定位到 编号为 k 的前面一个人for (int i = 1; i < k; i++) {pre = pre.next;}// 报数到mwhile (true) {if (last.next == last) { // 只有一个元素out.add(last.getData());last = null;break;}// 获取数到m的结点的前面一个结点for (int i = 1; i < m; i++) {pre = pre.next;}// 从循环链表中删除该结点if (pre.next == last) last = pre; // 如果删除的是最后一个结点则将last指向preout.add(pre.next.getData()); // 将删除的结点值保存pre.next = pre.next.next;}return out;}
}

二、动态规划

2.1 斐波那契数列 2022.4.18

在这里插入图片描述

class Solution {// method1: 递归// public int fib(int n) {//     if(n==0){//         return 0;//     }//     if(n==1){//         return 1;//     }//     return fib(n-1)+fib(n-2);// }// method2: 记忆法// public static long[] fibs = new long[101];// static{//     fibs[0] = 0L;//     fibs[1] = 1L;// }// private static int curIndex = 1;// public int fib(int n) {//     if(n<=curIndex){//         return (int) fibs[n];//     }//     while(curIndex<n){//         curIndex++;//         fibs[curIndex] = (fibs[curIndex-1] + fibs[curIndex-2])% 1000000007;//     }//     return (int) fibs[n];// }// method3: 动态规划public int fib(int n) {if(n==0){return 0;}if(n==1){return 1;}int n1 = 0;int n2 = 1;int sum = 0;for(int i = 2;i<=n;i++){sum = (n1+n2)%1000000007;n1 = n2;n2 = sum;}return sum;}
}

2.2 青蛙上台阶 2022.4.18

在这里插入图片描述

在这里插入图片描述

class Solution {public int numWays(int n) {// 动态规划(等价于斐波拉切)if(n == 0){return 1;}if(n == 1){return 1;}int n1 = 1;int n2 = 1;int sum = 0;for(int i = 2; i <= n; i++){sum = (n1+n2) % 1000000007;n1 = n2;n2 = sum;}return sum;}
}

三、位运算符

3.1 二进制中1的个数 2022.4.18

https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof/

在这里插入图片描述

在这里插入图片描述

public class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n) {// method1: 从二进制的最右一位逐位判断1// int hw = 0;// while(n!=0){//     hw += n&1;//     n>>>=1; // 无符号右移// }// return hw;// method2: 利用 n&(n-1)int hw = 0;while(n!=0){hw++;n&=n-1; // 会将二进制最右侧的一去除}return hw;}
}

四、回溯算法

4.1 打印从1到最大的n位数 2022.4.18

在这里插入图片描述

// class Solution {
//     public int[] printNumbers(int n) {
//         // method1: 非大数打印
//         int end = (int)Math.pow(10, n) - 1;
//         int[] res = new int[end];
//         for(int i = 0; i < end; i++)
//             res[i] = i + 1;
//         return res;//     }
// }class Solution {// method2: 大数打印int[] res;char[] chars = {'0','1','2','3','4','5','6','7','8','9'};char[] nums;int n,count=0;public int[] printNumbers(int n) {this.n = n; // 最大的位数// 创建输出结果的int数组res = new int[(int)Math.pow(10,n)-1];nums = new char[n]; // nums为与最大位数个数相同的字符数组,用于保存每个数dfs(0);return res;}/**基于深度优先的字符打印*/private void dfs(int x){if(x == n){// 字符数组转换为字符串String nStr = String.valueOf(nums);// 字符串转换为数字// 不保留数字0int m;if((m=Integer.parseInt(nStr))!=0){res[count++] = m;}return;}for(char p:chars){nums[x] = p;dfs(x+1);}}}

五、双指针

5.1 单链表反转 2022.4.18

// 基于迭代
// 单链表的反转// 先定义一个结点 reverseHead=new Node// 从头到尾遍历原来的链表,每遍历一个结点,就将其取出,并放在新的链表的最前端(头插法)// 原来的链表的 head.next = reverseHead.nextpublic void reverseLink() {// 1. 没有数据或只有一个数据,就不操作if (head.next == null || head.next.next == null) return;// 设置反转链表的头结点Node<T> reverseHead = new Node<>(null, null);Node<T> cur = head.next;// 指向当前的结点Node<T> next; // 指向当前结点[cur]的下一个结点while (cur != null) {// 暂时保存当前结点的下一个结点next = cur.next;// 头插法cur.next = reverseHead.next;reverseHead.next = cur;// 更新当前结点位置cur = next;}head.next = reverseHead.next;}
package com.gyh.reverselinkedlist;/*** @author Gao YongHao* @version 1.0*/
public class ReverseList {public static void main(String[] args) {ListNode node5 = new ListNode(5, null);ListNode node4 = new ListNode(4, node5);ListNode node3 = new ListNode(3, node4);ListNode node2 = new ListNode(2, node3);ListNode node1 = new ListNode(1, node2);ListNode prev = recursion(node1);while (prev != null) {System.out.println(prev.val);prev = prev.next;}}public static ListNode iterate(ListNode node) {return null;}// 递归public static ListNode recursion(ListNode head) {// 如果头结点为null或找到尾元素则返回if (head == null || head.next == null) {return head;}// 递归返回最后一个结点的ListNode new_head = recursion(head.next);head.next.next = head;head.next = null;return new_head;}}class ListNode {Integer val;ListNode next;public ListNode(Integer val, ListNode next) {this.val = val;this.next = next;}
}

5.2 链表中倒数第k个节点 2022.4.18

在这里插入图片描述

在这里插入图片描述

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) { val = x; }* }*/
class Solution {public ListNode getKthFromEnd(ListNode head, int k) {// int length = 0;// ListNode curr = head;// method1: 求全长+遍历// // 求链表长度// while(curr!=null){//     length++;//     curr = curr.next;// }// // 迭代获取倒数第k个结点// curr = head;// for(int i = 0;i<length-k;i++){//     curr = curr.next;// }// return curr;// method2: 基于快慢指针ListNode former=head, laster=head;// 让 former 先走 k 步for(int i = 0;i < k-1;i++){// 如果链表长度小于k则返回nullif(former == null) return null;former = former.next;}// 保持 former 与 laster的间距,使 former指向最后一个元素,则laster指向倒数第k个元素while(former.next!=null){former = former.next;laster = laster.next;}return laster;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/53999.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

统信服务器操作系统【d版字符系统升级到dde图形化】配置方法

统信服务器操作系统d版本上由字符系统升级到 dde 桌面系统的过程 文章目录 一、准备环境二、功能描述安装步骤1. lightdm 安装2. dde 安装 一、准备环境 适用版本&#xff1a;■UOS服务器操作系统d版 适用架构&#xff1a;■ARM64、AMD64、MIPS64 网络&#xff1a;连接互联网…

kettle 数据库迁移 使用分页原理实现 数据库mysql

使用 kettle 9.0 先修改配置文件: C:\Users\xx\.kettle 新增如下配置,解决mysql 空字符串 自动转 null bug KETTLE_EMPTY_STRING_DIFFERS_FROM_NULLY git地址: GitHub - 2292011451/kettle_tool 第一步: 先把要迁移的表进行读取,循环查询每个表的最大数量以及页数,追加到…

linux文件系统权限详解

注:目录的执行权限代表是否可以进入。 一、文件权限控制对文件的访问: 可以针对文件所属用户、所属组和其他用户可以设置不同的权限 权限具有优先级。user权限覆盖group权限,后者覆盖other权限。 有三种权限类别:读取、写入和执行 读权限:对文件:可读取文件…

VS Code 配置 C/C++ 编程运行环境(保姆级教程)

文章目录 一、软件下载1. 下载 VS Code 安装工具 2. 下载 MinGW-W64二、安装 VS Code三、安装 MinGW-W64 及配置环境变量四、配置 VS Code 的 C/C 编程运行环境1. 汉化 VS Code&#xff08;选做&#xff09;2. 安装 C/C 扩展包 五、测试 VS Code 的 C/C 编程环境1. 创建代码文件…

hku-mars雷达相机时间同步方案-软件驱动(MID360与海康MV-CB060-10UMUC-S)

hku-mars雷达相机时间同步方案-软件驱动 hku的方案在硬件和软件方面都做了工作&#xff0c;所以才会实现相机帧和雷达帧的完全对齐。硬件方面的设置请参考上一期。 港大的同步结果&#xff1a; hku-mars雷达相机时间同步方案-硬件&#xff08;MID360与海康MV-CB060-10UMUC-S&…

窗口嵌入桌面背景层(vb.net,高考倒计时特供版)

开发思路 根据系统生成高考倒计时的具体时间&#xff0c;附加江苏省省统考的时间生成算法&#xff0c;并且用户可以根据实际情况调整前后30天&#xff0c;具有丰富多彩的图片库和强大的自定义功能&#xff0c;效果图见P3 目前程序处于正式版的1.4版本&#xff0c;本程序由本作…

【HarmonyOS】鸿蒙头像上传-(编辑个人信息页- 头像上传)+实时数据更新

#效果图 #思路 ##步骤&#xff1a; ###一、利用picker api选择1张图片 实例化选择器参数(使用new PhotoSelectOptions())实例化图片选择器 (使用newPhotoViewPicker() )调用图片选择器的select方法传入选择器参数完成图片选取获得结果 利用picker api选择1张图片 async sele…

[Redis] Redis中的Hash类型和List类型

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

eureka.client.service-url.defaultZone的坑

错误的配置 eureka: client: service-url: default-zone: http://192.168.100.10:8080/eureka正确的配置 eureka: client: service-url: defaultZone: http://192.168.100.10:8080/eureka根据错误日志堆栈打断电调试 出现两个key&#xff0c;也就是defaultZone不支持snake-c…

【PCB工艺】如何实现PCB板层间的互连

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 前言①、什么是通孔②、通孔是怎样产生的③、通孔种类④、盘中孔⑤、设计建议 前言 送给大学毕业后找不到奋斗方向的你…

C++函数在库中的地址

本文讲述C如何直接调用动态库dll或者so中的函数。 首先我们准备一个被调用库&#xff0c;这个库里面有两个函数&#xff0c;分别是C98 与 C11 下的&#xff0c;名称是run2和run1。 被调用库 相关介绍请看之前的文章《函数指针与库之间的通信讲解》。 //dll_ex_im.h #ifndef…

OpenSSH9.8p1编译rpm包(建议收藏)

1.升级前的openssh版本 [root@ncayu8847 ~]# ssh -V OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 20172.下载软件包(离线包) openssh 源码下载地址: https://mirrors.aliyun.com/pub/OpenBSD/OpenSSH/portable/openssl源码下载 https:/

JUC学习笔记(二)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 四、共享模型之内存4.1 Java 内存模型4.2 可见性退不出的循环解决方法可见性 vs 原子性模式之 Balking1.定义2.实现 4.3 有序性原理之指令级并行1. 名词2.鱼罐头的故…

关于手机号码数理的计算和推导,获得“平替”尾号

文章背景&#xff1a;我个人比较相信命运&#xff0c;对于手机号码的吉凶或是数理颇为在乎。最近&#xff0c;我沉浸于这方面的研究中&#xff0c;并发现许多手机号码的数理核心竟出奇地一致——关键在于后四位尾号&#xff0c;而前面的数字似乎并不占据主导位置。然而&#xf…

使用 GaLore 预训练LLaMA-7B

项目代码&#xff1a; https://github.com/jiaweizzhao/galorehttps://github.com/jiaweizzhao/galore 参考博客&#xff1a; https://zhuanlan.zhihu.com/p/686686751 创建环境 基础环境配置如下&#xff1a; 操作系统: CentOS 7CPUs: 单个节点具有 1TB 内存的 Intel CP…

【C++】入门基础(下)

Hi&#xff01;很高兴见到你~ 目录 7、引用 7.3 引用的使用&#xff08;实例&#xff09; 7.4 const引用 【第一分点】 【第二分点1】 【第二分点2】 7.5 指针和引用的关系&#xff08;面试点&#xff09; 8、inline 9、nullptr Relaxing Time&#xff01; ———…

Mysql(二) - 约束, 进阶查询

目录 一.约束 1.not null 2.unique 3.default 4.primary key 5. foreign key 6.check 7. 综合使用 二.进阶查询 1.新增(插入查询的结果) 2.聚合查询 a.聚合函数 b.使用 3.分组查询 4.联合查询 a.内连接 b.外连接 c.自连接 d.子查询 5.合并查询 三.总结 一…

基于SpringBoot的招生宣传管理系统【附源码】

基于SpringBoot的招生宣传管理系统&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 系统概述 4.2系统功能结构设计 4.3数据库设计 4.3.1数据库E-R图设计 4.3.2 数据库表结构设计 5 系统实现 5.1管理员功能介绍 5.1.1管理员登录 …

Ubuntu22.04系统安装opencv步骤简述及问题解决方法

前言 opencv是一个功能强大、开源且跨平台的计算机视觉库&#xff0c;适用于多种编程语言和操作系统&#xff0c;能够帮助开发者构建各种视觉项目。其模块众多&#xff0c;提供了诸多功能&#xff0c;能够进行图像处理、视频处理等等。比如&#xff1a;Highgui模块提供图像用户…

Python 解析 JSON 数据

1、有如下 JSON 数据&#xff0c;存放在 data.json 文件&#xff1a; [{"id":1, "name": "小王", "gender": "male", "score": 96.8}, {"id":2, "name": "小婷", "gender&qu…