算法
zyj0813
golang、Linux、区块链
展开
-
求两个数额最大公约数的几种方法并对其优化
package mainimport "fmt"/* 使用辗转相除法求两个数的最大公约数。 思路:辗转相除法原理为 a 和 b的最大公约数等于 b 和 a%b的最大公约数 (a > b) , 依次类推把求a b 的最大公约数换算成较小的值来求*/func getGreatestCommonDivisorV1(a, b int) int { // 首先要保证 a &g...原创 2019-11-30 22:19:55 · 356 阅读 · 1 评论 -
判断一个单向链表中是否存在环
package mainimport "fmt"/* 题目: 判断一个单向链表中是否存在环 最优解思路:1. 使用两个指针,起点都从链表的头结点开始,第一个指针每一步走一个节点,第二个指针每一步走两个节点,如果存在环两个指针一定会相遇的。这类似于小学中学的追击问题:在一个环形跑道上两个运动员同一地点出发一个运动员速度快另一个速度慢,两个运动员一定会相遇。*/// 假设链表节点...原创 2019-11-30 22:10:06 · 807 阅读 · 0 评论 -
巧妙判断一个数是否为2的整数次幂
package mainimport "fmt"/* 如何判断一个数是否为2的整数次幂 思路1. 暴力破解:从1开始乘以2,循环并和目标值比较,当大约目标值则终止,显然此方法效率非常低下 思路2. 把乘以2改为移位运算,提高一点效率,还是没有解决算法的根本问题 思路3. 通过转换成二进制观察,为2的整数次幂的数字转换成2进制都是首位为1其他位都为0的数字,比如10,100,100...原创 2019-11-30 22:00:23 · 407 阅读 · 0 评论 -
求两个有序数组的中位数
要求: 给定两个大小为 m 和 n 的有序数组nums1 和nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为O(log(m + n))。例如:nums1 = [1, 3]nums2 = [2]则中位数是 2.0nums1 = [1, 2]nums2 = [3, 4]则中位数是 (2 + 3)/2 = 2.5算法解析:中位数:将一个集合划分为两...原创 2019-11-30 21:39:56 · 312 阅读 · 0 评论 -
golang环形链表实现约瑟夫问题
约瑟夫问题:是一个出现在计算机科学和数学中的问题,在计算机编程算法中类似问题又称为约瑟夫环或者叫做“丢手帕问题”。约瑟夫问题的原理:n个人围成一圈,选择一个人开始报数,每过m次则当前报数的人则会被踢出圈,然后挨着的下一个人作为又一轮游戏的第一个报数的人,这样重复最后只会剩下一个人。例如: n = 6, m = 5,陆续被踢出圈的人的编号为:5,4,6,2,3,1.代码实现如下:...原创 2019-11-30 16:51:16 · 557 阅读 · 0 评论 -
给定一个字符串,请找出其中不含有重复字符的最长子串
package mainimport "fmt"/**给定一个字符串,请找出其中不含有重复字符的最长子串eg: 输入: "abcacabb" 输出: "abc"*/func getLongestString(ss string) string { storeMap := make(map[int]string) // key为保存的字符转最后一个字符在整个字符串中的index,...原创 2019-11-30 15:54:46 · 353 阅读 · 0 评论 -
三个水壶算法实现
三个水壶算法: 三个水壶的容积分别为8升,5升,3升,最开始第一个水壶装满了8升的水,每次倒水都只能倒满或者是倒空这两种情况,求出三个水壶中装有4升水的最优倒水。package mainimport "fmt"/** 三个水壶算法三个水壶的容积分别为8升,5升,3升最开始第一个水壶装满了8升的水每次倒水都只能倒满或者是倒空这两种情况求出三个水壶中装有4升水的最优倒水*/...原创 2019-11-30 14:50:35 · 1809 阅读 · 0 评论 -
实现稀疏数组
稀疏数组:把具有不同值的元素的行、列以及值记录到一个小规模的数组中,从而缩短程序的规模,也起到压缩数组的功能。代码实现如下: // 1. 创建一个11X11的二维数组,并初始化两个元素 var chessMap [11][11]int chessMap[1][2] = 1 chessMap[2][3] = 2 // 2. 打印出二维数组如下 for _, v := range ...原创 2019-11-19 21:23:49 · 232 阅读 · 0 评论