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.xdnf.cn/news/142505.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Python爬虫系列】_023.关于视频爬取

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈…

全方位解读信息架构:从挑战到解决方案,推动企业数字化转型的全面指南

在数字经济迅猛发展的今天&#xff0c;信息架构 已经成为企业实现数字化转型、提高运营效率和优化 IT 投资的关键手段。无论是初创企业还是成熟企业&#xff0c;构建和实施有效的信息架构不仅能支持业务增长&#xff0c;还能确保数据安全和合规性。《信息架构&#xff1a;商业智…

如何在kotlin中给空字符串(””)和null值设置默认值问题?

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

回归预测|基于鲸鱼优化随机森林数据的数据回归预测Matlab程序 多特征输入单输出WOA-RF

回归预测|基于鲸鱼优化随机森林数据的数据回归预测Matlab程序 多特征输入单输出WOA-RF 文章目录 一、基本原理鲸鱼优化算法&#xff08;WOA&#xff09;随机森林&#xff08;RF&#xff09;WOA-RF的结合总结 二、实验结果三、核心代码四、代码获取五、总结 一、基本原理 WOA-R…

数据结构——树(终极版)

树的基本概念&#xff1a; 树的顶部是根节点也是树的入口 父节点&#xff1a;例如&#xff1a;B是F的父节点 子节点&#xff1a;树中的每个节点都可以有0个或多个子节点 叶子节点&#xff1a;像KLFGMIJ这种没有子节点的节点 节点的度&#xff1a;节点的子节点数&#xff1…

Minio环境搭建(单机安装包、docker)(一)

前言&#xff1a; 项目中客户不愿意掏钱买oss&#xff0c;无奈只能给他免费大保健来一套。本篇文章只是记录验证可行性&#xff0c;毕竟minio太少文档了&#xff0c;参考着官网来。后面还会再出一套验证集群部署的文章。 一、资料 MinIO官网&#xff1a; MinIO | S3 Compatib…

使用Qt 搭建简单雷达

目录 1.简易雷达图思维导图 2.结果展示图 3.制作流程 3.1表盘的绘制 3.1.1 绘制底色 ​编辑 3.1.2 绘制大圆 3.3.3绘制小圆 3.3.4 绘制小圆的内容 3.3.5 绘制表盘刻度和数字标注 3.3.6 绘制指针 3.3.7 绘制扇形 3.2 设置定时器让表盘动起来 3.3.1 设置动态指针…

Fastjson反序列化漏洞——JNDI注入

一.前言 之前使用反序列化和序列化时写入的到文件里面的&#xff0c;真实环境中&#xff0c;也是这样吗&#xff1f; 当然不是了&#xff0c;通过二进制&#xff0c;字节流数据进行的。 为什么会有JNDI&#xff1f; 由于http和ftp传输消耗资源仍然很大&#xff0c;就有了JRM…

EasyRecovery 17完美破解版 2024 年最新永久免费使用 EasyRecovery激活图文教程

我们在平时使用电脑或者操作文件过程中&#xff0c;或多或少都有过格式化文件或者为了方便&#xff0c;直接摁住了shifitdelete键&#xff1b;删除后发现&#xff0c;我们删错了&#xff0c;有些文件不是我们要删的&#xff0c;甚至有的文件是特别重要的&#xff1b;这时候恢复…

基于java 的医院排号管理系统设计与实现

博主介绍&#xff1a;专注于Java .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的可以…

【无人机设计与控制】四旋翼无人机俯仰姿态保持模糊PID控制(带说明报告)

摘要 为了克服常规PID控制方法在无人机俯仰姿态控制中的不足&#xff0c;本研究设计了一种基于模糊自适应PID控制的控制律。通过引入模糊控制器&#xff0c;实现了对输入输出论域的优化选择&#xff0c;同时解决了模糊规则数量与控制精度之间的矛盾。仿真结果表明&#xff0c;…

FastGPT一站式解决方案[2-应用篇]:轻松实现RAG-智能问答系统,AI工作流、核心模块讲解

FastGPT一站式解决方案[2-应用篇]:轻松实现RAG-智能问答系统,AI工作流、核心模块讲解 1.FastGPT快速使用:基本设置、核心模块讲解 1.1 知识库设置 首先我们需要创建一个知识库。 知识库创建完之后我们需要上传一点内容。 上传内容这里有四种模式: 手动输入:手动输入问…

【网络】高级IO——poll版本TCP服务器

目录 前言 一&#xff0c;poll函数 1.1.参数一:fds 1.2.参数二&#xff0c;nfds 1.3.参数三&#xff0c;timeout 1.4.返回值 1.5.poll函数简单使用示例 二&#xff0c;poll版TCP服务器编写 2.1.编写 2.2.poll的优缺点 2.3.源代码 前言 由于select函数有下面几个特别…

奥维互动地图经纬度导入,再导出ovjsn再转化为kml格式

一、使用python将excel表中的经纬度换算成小数格式。 在文件上看到的经纬度是东经 1165′27.78″&#xff0c;北纬 2310′57.18″&#xff0c;要转化为116.09105,23.182550000000003 格式。如果要用vba编写函数&#xff0c;可能比较麻烦&#xff0c;为此我使用python来转化 i…

【例题】lanqiao3412 最小化战斗力差距

样例输入 3 1 2 3样例输出 1说明 样例中&#xff0c;当 a[1,3]&#xff0c;b[2]&#xff0c;此时战斗力差距为 1&#xff0c;无法得到比 1 更小的安排方式。 解题思路 目标是|max(a)-min(b)|最小&#xff0c;希望a里的最大值和b里的最小值能差距最小。 转化成&#xff1a;…

2024/9/16 英语每日一段

Stark argues that, in their gummies, at least,“The total sugar in a serving is less than in half a cherry.”Of course, cherries also provide fibre, vitamin C, and antioxidants--and 14 of them would count as one of your five-a-day. Artificial sweeteners to…

Linux操作系统文件权限管理

Linux操作系统下文件的权限分为当前用户权限、用户组权限和其他用户权限&#xff0c;然后每一类用户或组又分为读权限(r)、写权限(w)和可执行权限(x)。 如图1&#xff0c;打开任一目录&#xff0c;右键单击文件&#xff0c;在弹出菜单选择“属性”&#xff0c;在弹出的属性选项…

2022高教社杯全国大学生数学建模竞赛C题 问题一(1) Python代码演示

目录 问题 11.1 对这些玻璃文物的表面风化与其玻璃类型、纹饰和颜色的关系进行分析数据探索 -- 单个分类变量的绘图树形图条形图扇形图雷达图Cramer’s V 相关分析统计检验列联表分析卡方检验Fisher检验绘图堆积条形图分组条形图分类模型Logistic回归随机森林import matplotlib…

1.3 计算机网络的分类

欢迎大家订阅【计算机网络】学习专栏&#xff0c;开启你的计算机网络学习之旅&#xff01; 文章目录 前言一、按分布范围分类二、按传输技术分类三、按拓扑结构分类四、按使用者分类五、按传输介质分类 前言 计算机网络根据不同的标准可以被分为多种类型&#xff0c;本章从分布…

C语言刷题日记(附详解)(5)

一、选填部分 第一题: 下面代码在64位系统下的输出为( ) void print_array(int arr[]) {int n sizeof(arr) / sizeof(arr[0]);for (int i 0; i < n; i)printf("%d", arr[i]); } int main() {int arr[] { 1,2,3,4,5 };print_array(arr);return 0; } A . 1…