数学相关算法

将整数反转

// 示例 1: 
//
// 输入: 123
// 输出: 321
func reverse(x int) int {
    y := 0
    for ;x != 0; x /= 10 {
        y = y*10 + x%10
        if y < -(1 << 31) || y > 1 << 31 {
            return 0
        }
    }
    return y
}

 

两树相加

// 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
// 输出:7 -> 0 -> 8
// 原因:342 + 465 = 807
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    if l1 == nil && l2 == nil {
        return nil
    }
    sum1, sum2 := 0, 0
    for i := 1; l1.Next != nil; i *= 10 {
        if i == 1 {
            i = 0
        }
        sum1 = l1.Val + i
    }
    for i := 1; l2.Next != nil; i*=10 {
        if i == 1 {
            i = 0
        }
        sum2 = l2.Val + i*10
    }
    sum := sum1 + sum2
    head := &ListNode{0, nil}
    cur := head
    for ; sum > 0; sum /= 10 {
        val = sum % 10
        cur = &ListNode{val, nil}
        cur = cur.Next

    }
    return head
}
或者:
func addTwoNums(l1, l2 *listnode) *listnode {
    list := &listnode{}
    cur := list
    value, n := 0, 0
    for l1 != nil && l2 != nil {
        value, n = (l1.val+l2.val+n)%10, (l1.val+l2.val+n)/10
        cur.next = &listnode{value, nil}
        cur = cur.next
        l1 = l1.next
        l2 = l2.next
    }
    if l1 == nil && l2 != nil {
        value, n = (l2.val+n)%10, (l2.val+n)/10
        cur.next = &listnode{value, nil}
        cur = cur.next
        l2 = l2.next
    }
    if l2 == nil && l1 != nil {
        value, n = (l1.val+n)%10, (l1.val+n)/10
        cur.next = &listnode{value, nil}
        cur = cur.next
        l1 = l1.next
    }
    return list.next
}

 

// 【LeetCode-随机数】用 Rand7() 实现 Rand10()
func rand10() int {
    a, b := rand7(), rand7()
    for a > 6{
        a = rand7()
    }
    for b > 5 {
        b = rand7()
    }
    if a & 0x1 == 1 {    //a有50%的概率是奇数(1,3,5)
        return b
    }
    return 5 + b
}

 

// 优化后
func rand10() int {
    a := rand7()*6+rand7()      // 区间 [1,49]
    for a > 40 {
        a = rand7()*6+rand7()     // 区间 [1,40]
    }
    return a % 10 + 1        // a%10取余后为[1,9]
}

// 反过来rand5 实现rand3
func rand3() int {
  a := rand5()
  for a > 3 {
    a = rand5()
  }
  return a
}
// 万能公式 randx 实现 rand7:
func randy() int {
    a := randx()(x-1) + randx
    for a > int(a/y)*y {
        a = randx()(x-1) + randx
    }
    return a%y + 1
}

 

// 随机算法:从m个数中等概率取出n个数,要求算法复杂度为o(n)
// 每次随机取出一个数,之后将该数放置到数组的末尾去,这样下次取随机数的时候,只从1到目标集合个数-1个中随机抽取
func randnum(a []int, k int) []int {
    var result []int
    length := len(a)
    for ; k > 0; k-- {
        key := rand.Intn(length)
        result = append(result, a[key])
        length--
        a[key], a[length] = a[length], a[key]
    }
    return result
}

 

posted @ 2020-12-03 19:35  天之草  阅读(153)  评论(0)    收藏  举报