Java与算法(13)

13 道典型 Java 面试算法题及解答 思路:首先需要了解正则表达式,\d 表示数字。{n,m}表示字符个数。可以使用正则表达式从第6位之后开始截取 8 位即可取出年月日。// 测试是否为合法的身份证号码 String [ ] strs = {i ++) {// 用于提取出生日字符串 Pattern p3 = Pattern . compile("(\\d{4})(\\d{2})(\\d{2})");// 用于将生日字符串进行分解为年月日 for(int i = 0; 阅读详情

 Java与算法(13)

1.高效求解完全二叉树的节点个数
public class GetTreeNodeNumber {
	public static class Node {
		public int value;
		public Node left;
		public Node right;

		public Node(int data) {
			this.value = data;
		}
	}

	public static int nodeNum(Node head) {
		if (head == null) {
			return 0;
		}
		return bs(head, 1, mostLeftLevel(head, 1));
	}

	public static int bs(Node node, int l, int h) {
		if (l == h) {
			return 1;
		}
		if (mostLeftLevel(node.right, l + 1) == h) {
			return (1 << (h - l)) + bs(node.right, l + 1, h);
		} else {
			return (1 << (h - l - 1)) + bs(node.left, l + 1, h);
		}
	}

	public static int mostLeftLevel(Node node, int level) {
		while (node != null) {
			level++;
			node = node.left;
		}
		return level - 1;
	}
	public static void main(String[] args) {
		Node head = new Node(1);
		head.left = new Node(2);
		head.right = new Node(3);
		head.left.left = new Node(4);
		head.left.right = new Node(5);
		head.right.left = new Node(6);
		System.out.println(nodeNum(head));

	}

}
2.通过先序和中序数组直接生成后序数组
public class PreAndInArrayToPosArray {
	public static int[] getPosArray(int[] pre, int[] in) {
		if (pre == null || in == null) {
			return null;
		}
		int len = pre.length;
		int[] pos = new int[len];
		HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
		for (int i = 0; i < len; i++) {
			map.put(in[i], i);
		}
		setPos(pre, 0, len - 1, in, 0, len - 1, pos, len - 1, map);
		return pos;
	}
	
	public static int setPos(int[] p, int pi, int pj, int[] n, int ni, int nj,
			int[] s, int si, HashMap<Integer, Integer> map) {
		if (pi > pj) {
			return si;
		}
		s[si--] = p[pi];
		int i = map.get(p[pi]);
		si = setPos(p, pj - nj + i + 1, pj, n, i + 1, nj, s, si, map);
		return setPos(p, pi + 1, pi + i - ni, n, ni, i - 1, s, si, map);
	}

	public static void main(String[] args) {
		int[] pre = { 1, 2, 4, 5, 3, 6, 7 };
		int[] in = { 4, 2, 5, 1, 6, 3, 7 };
		int[] pos = getPosArray(pre, in);
		for(int i=0;i<pos.length;i++) {
			System.out.println(pos[i]);
		}
		
	}

}
3.先序,后序,中序两两结合重构二叉树
public class ErgtoTree {
	public static class Node {
		public int value;
		public Node left;
		public Node right;

		public Node(int data) {
			this.value = data;
		}
	}
	
	
	public static Node preintoTree(int[] pre,int[] in) {
		if (pre==null || in==null) {
			return null;
		}
		HashMap<Integer, Integer> hashMap = new HashMap<>();
		for(int i=0;i<in.length;i++) {
			hashMap.put(in[i], i);
		}
		
		return prein(pre, 0, pre.length-1, in, 0, in.length-1, hashMap);
		
	}
	
	public static Node prein(int[] p,int pi,int pj,int[] n,int ni,int nj,HashMap<Integer, Integer> hashMap) {
			if (pi>pj) {
				return null;
			}
			Node root = new Node(p[pi]);
			int index = hashMap.get(p[pi]);
			root.left = prein(p, pi+1,pi+index-ni, n, ni,index-1, hashMap);
			root.right = prein(p, pi+index-ni+1, pj, n, index+1, nj, hashMap);
			return root;
	}
	
	public static void prePrint(Node root) {
		if (root==null) {
			return;
		}
		System.out.print(root.value+" ");
		prePrint(root.left);
		prePrint(root.right);
	}
	
	public static Node inPosToTree(int[] in, int[] pos) {
		if (in == null || pos == null) {
			return null;
		}
		HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
		for (int i = 0; i < in.length; i++) {
			map.put(in[i], i);
		}
		return inPos(in, 0, in.length - 1, pos, 0, pos.length - 1, map);
	}

	public static Node inPos(int[] n, int ni, int nj, int[] s, int si, int sj,
			HashMap<Integer, Integer> map) {
		if (si > sj) {
			return null;
		}
		Node head = new Node(s[sj]);
		int index = map.get(s[sj]);
		head.left = inPos(n, ni, index - 1, s, si, si + index - ni - 1, map);
		head.right = inPos(n, index + 1, nj, s, si + index - ni, sj - 1, map);
		return head;
	}
	
	public static Node prePosToTree(int[] pre, int[] pos) {
		if (pre == null || pos == null) {
			return null;
		}
		HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
		for (int i = 0; i < pos.length; i++) {
			map.put(pos[i], i);
		}
		return prePos(pre, 0, pre.length - 1, pos, 0, pos.length - 1, map);
	}

	public static Node prePos(int[] p, int pi, int pj, int[] s, int si, int sj,
			HashMap<Integer, Integer> map) {
		Node head = new Node(s[sj--]);
		if (pi == pj) {
			return head;
		}
		int index = map.get(p[++pi]);
		head.left = prePos(p, pi, pi + index - si, s, si, index, map);
		head.right = prePos(p, pi + index - si + 1, pj, s, index + 1, sj, map);
		return head;
	}
	public static void main(String[] args) {
		int[] pre = { 1, 2, 4, 5, 8, 9, 3, 6, 7 };
		int[] in = { 4, 2, 8, 5, 9, 1, 6, 3, 7 };
		int[] pos = { 4, 8, 9, 5, 2, 6, 7, 3, 1 };
		Node root1 = preintoTree(pre, in);
		prePrint(root1);
		System.out.println();
		Node root2 = inPosToTree(in, pos);
		prePrint(root2);
		System.out.println();
		Node root3 = prePosToTree(pre, pos);
		prePrint(root3);
	}

}
Java 递归算法系列:建议收藏的 13 个经典问题的代码实现详解 递归是一种解决问题的方法,尤其常见于数学和计算机科学中,它是指在一个函数或过程的定义中直接或间接地调用自身的一种编程技术 递归的优点在于它能够简洁地表达一些自然地按照“大问题分解为相似的小问题”的模式解决的问题,如树和图的遍历、数据结构的构建等。然而,递归也需要注意控制递归深度以防止栈溢出,并且有时需要借助额外的数据结构(如栈或队列)或记忆化技术来提高效率,尤其是在解决具有大量重复子问题的情况时。 阅读详情

相关推荐

Java面试——13 道数据结构和算法⾯试题

右旋是以某个节点为中⼼, 将它沉⼊当前右⼦节点的位置,⽽让当前的左⼦节点作为新树的根节点,也称为顺时针旋转。同理左旋 是以某个节点为中⼼,将它沉⼊当前左⼦节点的位置,⽽让当前的右⼦节点作为新树的根节点,也称为。点,就将当前节点和⽗节点交换。在移除时⾸先暂存根节点的值,然后⽤最后⼀个节点代替根节点并作 为当前节点,如果当前节点存在⼦节点且值⼩于⼦节点,就将其与值较⼤的⼦节点进⾏交换,调整完堆。⽐较相邻的元素,如果第⼀个⽐第⼆个⼤就进⾏交换,对每⼀对相邻元素做同样的⼯作,从开始第⼀对。

zf888999666的博客 874

java实现instr_Java实现ROT13算法

package com.what21.rot13;import java.util.Collections;import java.util.HashMap;import java.util.Map;public final class Rot13 {private static final Map map;static {final char[] lookup1 = "ABCDEFGHIJKLM...

weixin_29012765的博客 356

13_冒泡算法(附完整java代码)

13_冒泡算法 一、基本介绍 ​ 冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。 ​ 因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。(这里说的优化,可以在冒泡排序写好后,在进行) 二、图示冒泡排序

jrrhjww的博客 907

java中的getrot_java - Java中的ROT-N(或ROT-X)功能 - 堆栈内存溢出

当前,我正在编写一个使用Java在给定String上执行ROT-1直到包括ROT-25的程序。 在研究的开始,我发现了以下代码:public class Rot13 {public static void main(String[] args) {String s = args[0];for (int i = 0; i < s.length(); i++) {char c = s.char...

weixin_29819789的博客 265

JavaScript实现的流行rot13加密工具:简易但受欢迎

本文还有配套的精品资源,点击获取 简介:文章标题中的"rot13"指的是一个简单字符替换算法,而作者自谦"烂"可能是对自己实现的谦虚评价,尽管如此,该工具因其简易性和趣味性而广受欢迎。本文将详细介绍rot13算法,并探讨如何用JavaScript语言实现它。内容涉及rot13算法的工作原理、JavaScript基础、编码实现、函数封装、用户交互、界面更新、代码优化以及社区反...

weixin_42577735的博客 1624

(project generation have a problem)STM32CubeMX生成工程一直报错项目生成有问题[玄学三步解]

解决办法 第一步,检查自己是不是真的配置的不对,JAVA安装没,pack路径设置的对不对,这里有一位前辈的博文写的非常好,附加链接https://blog.youkuaiyun.com/ybhuangfugui/article/details/52225736#commentBox 第二步,如果按照前辈的博文设置的都一模一样,还是不对,想我下图这样。 那你来对地方了 方法很简单,你把你生成工程文件的路径彻底的...

展桑博客-BenjieBlog 2919

chr 13 java 替换_Java ROT13编码转换算法实现

ROT13:只对字母进行编码,用当前字母往前数的第13个字母替换当前字母,例如当前为A,编码后变成N,当前为B,编码后变成O,以此类推顺序循环。packagecom.what21;importjava.io.IOException;publicclassRot13{publicstaticvoidmain(String[]args)throwsIOException{Sys...

weixin_34333047的博客 392

yolov11使用记录(训练自己的数据集)

本文介绍了如何安装和使用Ultralytics YOLOv11进行目标检测。首先,通过Anaconda创建并激活虚拟环境,安装必要的依赖库如PyTorch和Ultralytics。接着,从GitHub下载YOLOv11源码,并在PyCharm中配置环境。下载预训练的YOLOv11模型后,通过编写简单的Python脚本进行图片检测,验证环境配置的正确性。最后,文章提到可以基于此环境训练自定义模型。整个过程涵盖了从环境搭建到模型应用的完整流程,适合初学者快速上手YOLOv11。

IT菜鸟 7545

ROT13加密和解密

问题ROT13(回转13位)是一种简易的替换式密码算法。它是一种在英文网络论坛用作隐藏八卦、妙句、谜题解答以及某些脏话的工具,目的是逃过版主或管理员的匆匆一瞥。ROT13 也是过去在古罗马开发的凯撒密码的一种变体。ROT13是它自身的逆反,即:要还原成原文只要使用同一算法即可得,故同样的操作可用于加密与解密。该算法并没有提供真正密码学上的保全,故它不应该被用于需要保全的用途上。它常常被当作弱加密示例

neal1991的专栏 1万+

【open judge】【程设】魔兽世界三开战!

#程设 魔兽世界三---开战!--------原以为会很容易ac,没想到写了好久,看来自己的水平还是亟待提高啊!有几个比较有趣的点:1. typeid(#include&lt;typeinfo&gt;)还是比较好用的,特别是本题当战士为wolf,iceman, dragon, ninja时有特殊技能,那么用typeid判断一下就很方便了。2. 对于这种输出很复杂的问题,往往通过使用文件的输入输出再...

weixin_40841416的博客 6071

Java对接(BSC)币安链 | BNB与BEP20的开发实践(三)水龙头 WEB3

这一节我们讲一个币安测试链如何获取到BNB、USDT等BEP20数字货币(水龙头)来让我们前期测试开发。如图:我们将创建的地址填入相应输入框,来获取到测试BNB以及其他BEP20数字币。发币可能需要交易等待,请耐心等待即可,交易完成后,币会到达您的地址内。上一节我们用代码来实现BNB转账、BEP20转账、链上交易监控。2.MetaMask(小狐狸)浏览器插件 🪜。使用EDGE浏览器可以在浏览器直接打开。使用Chrome浏览器,请使用🪜打开。基本工作就绪后,即可进行开发测试。3. 测试区块链浏览器 🪜。

大猩猩的专栏 2790

算法:LeetCode13_罗马数字转整数_java实现

【代码】算法:LeetCode13_罗马数字转整数_java实现。

工匠精神coding,终生学习 257

Eureka常见面试题总结

点击关注我的博客原文 Eureka是Netflix组件的一个子模块,也是核心模块之一。云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移(来源springcloud中文网的介绍:https://www.springcloud.cc/)。下图总结了Eureka服务端(以下简称服务端)与Eureka客户端(以下简称客户端)之间协同工作的流程: 流程说明:...

u012105931的博客 2万+

Java面试13|算法

Java写算法时常用的函数: Stack void push(E e):将给定元素”压入”栈中。存入的元素会在栈首。即:栈的第一个元素E pop():将栈首元素删除并返回。 Queue boolean offer(E e):将元素追加到队列末尾,若添加成功则返回true。E poll():从队首删除并返回该元素。E peek():返回队首元素,但是不删除 D...

dianlong4020的博客 145

MS建模mmt

一、流程:1.定义好每个原子力场类型:Edit Sets(分组) 2.加H(一般是仅与Al-O八面体中的Al相连的O原子)、给H分组 3.“make P1”、校核化学式(正确与否) 4.扩成超晶胞(Na-mmt:4*1*1,Ca-mmt:4*2*1,illite:2*1*1,由化学式而定) 5.置换阳离子: mmt:模型中每 32 个 Si 4+有 1 个被 Al 3+ 取...

weixin_30721899的博客 2174

matlab 点云泊松盘采样

本文介绍了泊松盘采样算法在三维点云处理中的应用。该算法通过最小间距约束(任意两点距离≥r)和均匀分布特性,生成高质量、均匀分布的点集。文章详细阐述了参数设置(如采样半径、候选点数),并与体素栅格、随机采样等方法进行了对比。代码实现部分展示了MATLAB版本的泊松盘采样算法,包括KD树加速和候选点生成机制。实验结果表明,该方法能有效保持点云特征,适用于点云简化、曲面重建等场景。文中还提供了参数调整建议和不同应用场景下的使用指导。

点云侠的博客 536

java算法day13

可以类比循环,在循环中我们总是要执行相同的逻辑,但是递归的特点在于,他需要在这个过程中,将计算的结果依次返给上一级。向下的过程可以发现,一直在比较左节点的左孩子是否和右节点的右孩子相等,右节点的左孩子是否和左节点的右孩子相等。唯一的变化就是判断什么时候停下来,就是处理节点的时候,如果某个节点没有叶子节点,那不就说明这层之后该节点就没有孩子嘞。一上来先粗略的考虑,这个思路是正确的,粗略的考虑就是递归计算左右子树的最小深度,每一层返回上来的时候再+1。接下来的题目几乎都用到了递归,这里就解决晕递归的问题。

TOMOT77的博客 836

FPGA学习笔记(一)入门背景、软件及时钟约束的概念及程序下载与固化

使用正点原子的PFPGA开拓者V2学习,通过b站上正点原子的手把手教你学FPGA-基于开拓者V2学习。

贾saisai的博客 3277

Java数据结构与算法 day13 程序员十大常用算法

文章目录第十三章 十大常用算法二分查找算法(非递归)分治算法动态规划算法KMP算法贪心算法普利姆算法克鲁斯卡尔算法克鲁斯卡尔算法介绍克鲁斯卡尔算法图解说明克鲁斯卡尔算法分析如何判断是否构成回路-举例说明?鲁斯卡尔算法的代码说明迪杰斯特拉算法(这个没怎么懂!!!)弗洛伊德算法回溯算法全劇終!!! 第十三章 十大常用算法 本章源码:https://github.com/name365/Java-Data-structure 二分查找算法(非递归) 二分查找算法(非递归)介绍 前面我们讲过了二分查找算法,

杨丙寅 3049

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java算法OJ(13)双指针

哈喽大家好吖,今天继续加练算法题目,一共六道双指针,希望能对大家有所帮助,废话不多说让我们开始吧。

2301_81073317的博客 2583

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java算法——13实现栈

题目描述 实现一个栈的数据结构,使其具有以下方法:压栈、弹栈、取栈顶元素、判断栈是否为空以及获取栈中元素个数。 方法一:数组实现 数组实现栈,栈空间是一段连续的空间。 import java.util.ArrayList; class MyStack<T> { private ArrayList<T>arr; /**数组中存储元素的个数*/ private int stackSize; public MyStack(){ //初始

weixin_44704538的博客 268

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Day13认识Java排序算法

排序 上午: 数组排序:把数组中的元素,通过比较移位替换,使之变成一个有序序列 排序方式:冒泡排序,选择排序,插入排序,希尔排序,快速排序,基数排序,堆排序,归并排序 冒泡排序:数组元素两两比较,大的往后放,经过一轮比较后,最大的元素出现在最后面,如此往复,那么整个数组就有序了 public class Demo1 { public static void main(String[] ar...

u013583756的博客 128

day13 java基础API与常用算法_Exercises

写一个程序,对于给定一个这样的字符串求出字符串出现次数最多的那个字母以及出现的次数(若次数最多的字母有多个,则全部求出)假设日期段用两个6位长度的正整数表示,例如:(201401,201406)用来表示2014年1月到2014年6月,求两个日期段的重叠月份数。案例:有一个字符串String abc = “342567891”,请写程序将字符串abc进行升序,可以使用JDK API中的现有的功能方法。如果一个字符串,从前向后读和从后向前读,都是一个字符串,称为回文串,比如mom,dad,noon。

u010297404的博客 681

Java数据结构与算法13

它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。复制的次数大致等于比较的次数,然而,一次复制与一次比较的时间消耗不同,所以相对于随机数据,这个算法比冒泡排序快一倍,比选择排序略快。在第一趟排序中,插入排序最多比较一次,第二趟最多比较两次,依次类推,最后一趟最多比较N-1次。在插入某个元素之前需要先确定该元素在有序数组中的位置,上例的做法是对有序数组中的元素逐个扫描,的时候,这是一个很耗时间的过程,可以采用二分查找法改进,这种排序也被称为。

dulalalanunu的博客 96

【Java编程】13_雪花算法解读

背景 针对每个公司,随着服务化演进,单个服务越来越多,数据库分的越来越细,有的时候一个业务需要分成好几个库,这时候自增主键或者序列之类的主键id生成方式已经不再满足需求,分布式系统中需要的是一个全局唯一的id生成规则。 概述 SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。 其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增的,后面的代码中有详细的注解。 雪花算法生成的最终结果其实就

李鲤驴的博客 670
上一篇: Java与算法(12)
下一篇: 用Marven构建第一个Spring Boot应用
Coder_py
博客等级 码龄10年 106粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值