base算法
-
package mainimport ("fmt""math""math/rand""strconv""strings""time" ) // PrintBin 十进制转换成二进制 func PrintBin(number int32) []uint {bits := make([]uint, 0)for i := 31; i >= 0; i-- {//移i位后与运算number&10000000if number&(1<<i) == 0 {bits = append(bits, 0)} else {bits = append(bits, 1)}}return bits }// OddEven 判断奇数偶数 func OddEven(num int) {if num&1 != 0 {fmt.Println("ODD")} else {fmt.Println("EVEN")} }// OnesCountBin 求num中二进制1出现的次数 func OnesCountBin(num int) int {count := 0//for num != 0 {// //清楚数字中最后一位的1,比如1011&1010=1010,1010&1001=1000,1000&0111=0000// num = num & (num - 1)// count++//}for num != 0 {//判断最低位是否为1if num&1 == 1 {count++}num = num >> 1}return count }// HammingDistance 汉明距离1010&0011汉明距离为2 func HammingDistance(x int, y int) int {x = x ^ yreturn OnesCountBin(x) }// GetCountOf1 计算数字n中十进制1的个数 func GetCountOf1(n int) int {count := 0for n != 0 {if n%10 == 1 {count++}n /= 10}return count }// CountDigitOne 暴力计算1-n出现十进制出现1的个数 func CountDigitOne(n int) int {if n < 1 {return 0}count := 0for i := 0; i <= n; i++ {count += GetCountOf1(i)}return count }func CountDigitOne1(n int) int {str := strconv.Itoa(n)l := len(str)count := 0base := 1for i := l - 1; i >= 0; i-- {height, _ := strconv.Atoi(str[:i])cur, _ := strconv.Atoi(string(str[i]))low, _ := strconv.Atoi(str[i+1:])/**2104: 1,11\21\31\41-2101 个位数量:1+210*12104:10-19,110-119\210-219...2010-2019 十位数量:21*102104:100-199,1100-1199,2100-2104(105个) 百数量:1 + 104 + 2*1002104: 1000-1999 千万数量:0*1000+1000*/if cur == 0 {//当前值等于0:height * basecount += height * base}if cur == 1 {//当前位等于1:high * base + low之前所有位+1count += height*base + low + 1}if cur > 1 {//当前位大于1,(height + 1) * basecount += height*base + base}base *= 10}return count }// SwapTwoNumber 实现两数交换 func SwapTwoNumber(a, b int) {//1、采用临时变量//c:=a//a=b//b=c//2、采用加减法//a = a + b//b = a - b //b=a+b-b=a//a = a - b //a=a+b-a+b//3、按位运算a = a ^ bb = a ^ b //b=a^b^b=aa = a ^ b //a=a^b^a=a }// SumNStep 求n阶乘的和 func SumNStep(number int32) int64 {sum := int64(0)temp := int64(1)for i := int64(1); i <= int64(number); i++ {temp *= isum += temp}return sum }// RandInt 获取min到max随机数 func RandInt(min, max int) int {if min >= max || min == 0 || max == 0 {return max}//Seed生成的随机数rand.Seed(time.Now().Unix())return rand.Intn(max-min+1) + min }// Rand10 rand7->rand10 func Rand10() int {//randY必须是M的整数倍;(Y=40)rand40 := 40for rand40 >= 40 {// rand49 = (rand7()-1)*7+rand7()-1;(X =49,N=7)// 按下面方式计算找到 X>M && X是N的整数倍// randX =(randN-1)*N +rundN-1;// randX =(randN-1)*N*N+(randN-1)*N +rundN-1;rand40 = (RandInt(1, 7)-1)*7 + RandInt(1, 7) - 1}// randM=randY%M+1;return rand40%10 + 1 }// RandFloat 获取0-n的随机数 func RandFloat(n int) int64 {//return rand.Float64()//Seed生成的随机数rand.Seed(time.Now().Unix())return int64(rand.Float64() * float64(n)) }// RandO1 返回0概率为20%,返回1概率为80% func RandO1() int {rand.Seed(time.Now().Unix())if rand.Float32() > 0.8 {return 1} else {return 0} }// Rand0Equal1 返回0概率为20%,返回1概率为80%,返回1和0概率相等 func Rand0Equal1() int {//p*(1-p)=(1-p)*pnumber := rand01()for number == RandO1() {number = RandO1()}return number }// CompareFloat 比较复点数大小 func CompareFloat(n, n1 float64) bool {return math.Abs(n-n1) < 0.00001 }// IsPrime 判断是否为素数 func IsPrime(n int) bool {if n == 1 {return false}//从2遍历到n-1,看看是否有因子for i := 2; i < n; i++ {if n%i == 0 {return false}}return true }func IsPrimeII(n int) bool {//偶数一定不是素数if n > 2 && n%2 == 0 {return true}//从2遍历到n的方根,看看是否有因子for i := 2; i <= int(math.Ceil(math.Sqrt(float64(n)))); i++ {if n%i == 0 {return false}}return true }// CountPrime 统计n内有多少个素数 func CountPrime(n int) int {count := 0for i := 2; i <= n; i++ {if IsPrimeII(i) {count++}}return count }func CountPrime1(n int) int {count := 0arrs := make([]bool, n)for i := 2; i <= n; i++ {if !arrs[i] && IsPrimeII(i) {count++//埃式筛选 标记非素数,减小前面遍历次数for j := i * i; j < n; j += i {arrs[j] = true}}}return count }// SqrtN 使用牛顿法求平方根x*x=n、2x-x=n/x func SqrtN(n int) int {x := n//牛顿法求平方根for x*x > n {x = (x + n/x) / 2}return x }// FiboArrays 斐波那契数列 递归实现 func FiboArrays(n int) int {if n == 0 || n == 1 {return n}if n > 1 {return FiboArrays(n-1) + FiboArrays(n-2)}return -1 }func FiboArrays1(n int) int {//动态规划first := 0second := 1for i := 2; i <= n; i++ {temp := first + secondfirst = secondsecond = temp}return second }// FrogWays 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 func FrogWays(n int) int {if n <= 0 {return 0}if n == 1 || n == 2 {return n}return FrogWays(n-1) + FrogWays(n-2) }// ArrangeCoin 硬币排列成阶梯状态 func ArrangeCoin(n int) int {for i := 1; i <= n; i++ {//总数减出当前行n = n - iif n <= i {return i}}return 0 }func ArrangeCoin1(n int) int {left := 0right := n//二分法查找,当前包含的所有硬币数量(1+x)x/2for left < right {mid := (right-left)/2 + left//中间节点总银币数量:1+2+3+4+5=(1+5)*5/2count := (mid + 1) * mid / 2if count == n {return mid} else if count > n {right = mid} else {left = mid}}return -1 }// ReverseNumber 反转整数 func ReverseNumber(n int) int {temp, retV := n, 0for temp != 0 {cur := temp % 10//低位*10转换为高位,加上当前位retV = retV*10 + cur//去掉当前位,获取高位temp /= 10}//超出范围if retV > math.MaxInt || retV < math.MaxInt {return 0}return retV }// IntToRoman 整数转罗马数字 func IntToRoman(num int) string {numsmap := map[int]string{1: "I",4: "IV",5: "V",9: "IX",10: "X",40: "XL",50: "L",90: "XC",100: "C",400: "CD",500: "D",900: "CM",1000: "M",}//创建整数数组numsint := []int{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}results := []string{}count := 0for i := 0; i < len(numsint) && num != 0; i++ {//判断num有几个当前i的数字组成count = num / numsint[i]if count > 0 {//减去当前值i的数字num = num - count*numsint[i]for count != 0 {//记录罗马数字,更新count值results = append(results, numsmap[numsint[i]])count--}}}return strings.Join(results, "") }// RomanToInt 罗马数字转整数 func RomanToInt(s string) int {specialRomanStringMap := map[string]int{"IV": 4, "IX": 9, "XL": 40, "XC": 90, "CD": 400, "CM": 900}romanStringMap := map[string]int{"I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000}result := 0for len(s) != 0 {if len(s) > 1 {//当长度大于1的时候,才有必要去特殊罗马数字map中查找chars := s[0:2]if v, ok := specialRomanStringMap[chars]; ok {//当存在的时候记录值,记录整数,去掉两个字符result += vs = s[2:]} else {//不存在的时候去正常map中查找,并记录,记录整数,去掉一个字符result += romanStringMap[string(s[0])]s = s[1:]}} else {//记录整数,去掉一个字符result += romanStringMap[string(s[0])]s = s[1:]}}return result }// Divide 两数相除,不使用乘法、除法和 mod 运算符 func Divide(x int, y int) int {//直接返回最大值if x == math.MaxInt && y == math.MinInt {return math.MaxInt}if x == math.MinInt && y == -1 {return math.MaxInt}//判断运算后的正负flag := (x > 0 && y > 0) || (x < 0 && y < 0)//保存运算的结果result := 0//排除极端结果a := int(math.Abs(float64(x)))b := int(math.Abs(float64(y)))if a == 0 || a < b {return 0}//比如39=(2*2*2*3+2*2*3+1*3)/3=2*2*2+2*2+1for i := 31; i >= 0; i-- {//a大于b*2的i次方temp := b << iif a >= temp {result += 1 << i // i个2相乘加到resulta -= temp // a减去b乘以i个2}}if flag {return result} else {return -result} }// Pow x的n次方 func Pow(x float64, n int) float64 {if n == 0 || x == 1.0 {return 1.0}var ans float64 = 1.0//n转换成整数b := nif n < 0 {b *= -1}//5的11次方:就拆成5的(1+2+8)次方,1+2+8是 2的0次方+2的1次方+2的3次方,var base float64 = xfor b != 0 {//11 为1011判断每位上是否为1if b&1 != 0 {ans *= base}//5的1次方,2次方,8次方base *= base//11 每次右移一位b >>= 1}//负数恢复if n < 0 {return 1.0 / ans}return ans }// GetCommonData 最大公约数 func GetCommonData(a, b int) int {// 如果分子大于分母,需要交换顺序if a < b {a, b = b, a}for b != 0 {temp := a % ba = bb = temp}return a }// LargeCommonData 最小公倍数 func LargeCommonData(x, y int) int {//最小公倍数=两数之积/最大公约数return x * y / GetCommonData(x, y) }// ChampagneTower 香槟塔:动态规划 func ChampagneTower(poured, row, col int) int {if col > row {return -1}dp := make([][]int, 100)for i := 0; i < 100; i++ {dp[i] = make([]int, i)}//计算出每层每个杯子的总香槟数量dp[0][0] = pouredfor r := 0; r <= row; r++ {for c := 0; c < r; c++ {d := (dp[r][c] - 1) / 2if d > 0 {//当前杯子满了置为1dp[r][c] = 1//当前杯子多余的一半给左边一半给右边dp[r+1][c] += ddp[r+1][c+1] += d}}}return dp[row][col] }// CountAndSay 双指针:外观数列 111221->31 22 11 func CountAndSay(n int) string {if n == 1 {return "1"}str := CountAndSay(n - 1)//111221->31 22 11result := make([]byte, 0)//双指针left, right := 0, 1for left < len(str) {//左右相等右指针加一,直到遍历到不相等for right < len(str) && str[left] == str[right] {right++}//计算有几个当前left数,比如3个1,就是31result = append(result, byte(right-left+'0'))result = append(result, str[left])//从右边重新开始遍历left = right}return string(result) }func main() {array := PrintBin(5)for _, v := range array {fmt.Printf("%+v", v)}fmt.Println("")fmt.Println(OnesCountBin(3))fmt.Println(Divide(39, 3)) }