目录

hymn

忽有故人心头过,回首山河已是秋。

寻找全排列的下一个数

给出一个正整数,找出这个正整数所有数字全排列的下一个数。 通俗的讲,就是在一个正整数所包含数字的全部组合中,找到一个大于且仅大于原数的新整数。 比如: 输入 12345 输出 12354 输入 12354 输出 12435 package tree; import java.util.Arrays; /** * @author: daixyhymn * @description: 全排列 * @date: 2020/11/9 14:06 */ public class FindNearestNumber { public static int[] findNearestNumber(int[] numbers){ // 1、从后向前查看逆序区域 int index = findTransferPoint(numbers); // 如果返货 0 ,说明数组已经完全逆序,没有更大的 if (index == 0) return null; // 2、把逆序区域刚刚大于他的数字交换位置 exchangeHead(numbers, index); // 3、把原来的逆序区域转为正序 rev....

判断一个数是否是 2 的整数次幂次

/** * @author: daixyhymn * @description: * @date: 2020/11/6 16:56 */ public class isPowerOf2 { /** * 判断一个数是否使 2 的倍数 * 规律 * 如果一个数 a 是 2 的倍数, (a & a -1) == 0 * @param a * @return */ public static boolean isPowerOf2(int a){ return (a & a -1) == 0; } public static void main(String[] args) { System.out.println(isPowerOf2(16)); } }

求最大公约数 有更新!

/** * @author: daixyhymn * @description: 最大公约数 * @date: 2020/11/6 16:16 */ public class GreatestCommonDivisor { /** * 暴力枚举(从小数的一半开始枚举) * @param a * @param b * @return */ public static int gcd(int a, int b){ int big = a > b ? a : b; int small = a < b ? a : b; if (big % small == 0) { return small; } for (int i = small / 2; i > 1 ; i--) { if (small % i == 0 && big % i == 0) { return i; } } return 1; } /** * 辗转相除法,又叫欧几里算法, * 两个正整数,a b (a > b) ,他们的最大公约数等于 a 除以 b 的余数 c 和 b 之间的最大公约数....

判断是否有坏换(追击问题)

如何判断链表有坏换 一、直接遍历 从头遍历,没当遍历到新的节点时,从头遍历,查看是否有重复的节点,如果有,就说明有环 时间复杂度:O(n2) 空间复杂度 O(1) 二、创建Hashset集合 遍历链表,把新的节点放在Hashset中,如果Hashset中存在,这说明有环 时间复杂度:O(n) 空间复杂度 O(n) 三、追击问题 创建两个指针,p1和p2,同时只想头节点,然后开始循环,p1每次向前移动一个元素,p2每次向前移动两个元素,然后比较两个指针指向的元素是否相同,如果相同则说明有环。 原因:追击问题,快的指针一定会追上慢的指针。 时间复杂度:O(n) 空间复杂度:O(1) /** * @author: daixyhymn * @description: * @date: 2020/11/6 15:14 */ public class Cycle { public static boolean cicyle(Node head){ Node p1 = head; Node p2 = head; while(p2 != null && p2.next !=....

有更新!

凡尘因果俱匆忙, 莫与岁月道过往。 情缘聚散皆慌张, 勿与人生论短长。

快排 有更新!

快速排序: 在每一轮挑选一个基准元素,并让其他比他大的移动到一边,比他小的移动到另一边,从而把数组拆解成两个部分。这种思路叫做分治法。 时间复杂度:O(nlogn) package sort; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Stack; /** * @author: daixyhymn * @description: 快排 * @date: 2020/11/4 14:50 */ public class QuickSort { /** * 快排 * @param array * @param startIndex * @param endIndex */ public static void quickSort(int[] array, int startIndex, int endIndex){ // 递归条件结束: startIndex 大于 endIndex if (startIndex >= endIndex) { retu....

二叉树遍历 有更新!

二叉树遍历,前序 中序 后序

二叉堆 有更新!

二叉堆操作: 插入节点 删除节点 构建二叉堆 以最小堆为例: (一)插入节点时,插入位置是完全二叉树的最后一个位置,通过“上浮”的操作实现平衡 (二)删除节点与插入节点刚好相反,将最后一个位置的节点补到删除位置,然后通过“下沉”的操作实现平衡。 (三)构建二叉树,也就是把一个无序的完全二叉树调整为二叉堆,本质就是让所有非叶子节点一次“下沉”。 package tree; import java.util.Arrays; /** * @author: daixyhymn * @description: 二叉堆 * @date: 2020/11/3 16:50 */ public class TreeHeap { /** * "上浮" * @param array */ public static void upAdjust(int[] array){ int childIndex = array.length - 1; int parentIndex = (childIndex - 1) / 2; // temp 保存插入的叶子节点,用于最后的赋值 int temp = array[....

MySQL 排序 FIELD

需求:按照指定字符串排序, 分析:运用 FIRLD 可以实现 问题:字段中有null 值,需要放到最后 // 在排序前加 rating is null 并且 在 FLELD 中加 IFNULL(rating,"") SELECT * FROM `dl_school` ORDER BY rating is null,FIELD(rating,"A+","A","A-",IFNULL(rating,"")),sort DESC

equals 和 hashcode 有更新!

规范1:若重写equals(Object obj)方法,有必要重写hashcode()方法,确保通过equals(Object obj)方法判断结果为true的两个对象具备相等的hashcode()返回值。说得简单点就是:“如果两个对象相同,那么他们的hashcode应该 相等”。不过请注意:这个只是规范,如果你非要写一个类让equals(Object obj)返回true而hashcode()返回两个不相等的值,编译和运行都是不会报错的。不过这样违反了Java规范,程序也就埋下了BUG。 规范2:如果equals(Object obj)返回false,即两个对象“不相同”,并不要求对这两个对象调用hashcode()方法得到两个不相同的数。说的简单点就是:“如果两个对象不相同,他们的hashcode可能相同”。 结论: 如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。 如果两个对象不equals,他们的hashcode有可能相等。 如果两个对象hashcode相等,他们不一定equals。 如果两个对象hashcode不相等,他们一定不equals....