前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode中级算法-数学(1)

LeetCode中级算法-数学(1)

作者头像
码农帮派
发布2021-01-12 14:56:36
3030
发布2021-01-12 14:56:36
举报
文章被收录于专栏:码农帮派码农帮派

快乐数

[题目]

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。

[输入]

19

[返回]

true

解释:

12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

[解法]

维护一个map存储当前计算快乐数的结果,然后无限迭代的计算快乐数,要是计算出的结果是1,表示是快乐数,要是计算出的结果在map中存储,说明要进入一个死循环了,则表示不是快乐数

[代码实现]

package main

import "fmt"

func main() {
  input := 19
  result := computeResult(input)
  fmt.Println("result:", result)
}

func computeResult(input int) bool {
  filter := map[int]bool {}
  num := input
  for true {
    if num == 1 {
      return true
    }
    
    if _, exists := filter[num]; exists {
      break
    }
    
    num = _computeNext(input)
  }

  return num == 1
}

func _computeNext(input int) int {
  result := 0
  for input > 0 {
    item := input % 10
    input = input / 10
    result = item * item
  }
  return result
}

阶乘后的零

[题目]

给定一个整数 n,返回 n! 结果尾数中零的数量。

[输入1]

3

[返回1]

0

解释: 3! = 6, 尾数中没有零。

[输入2]

5

[返回2]

1

解释: 5! = 120, 尾数中有 1 个零.

[解法]

阶乘的结果中,结尾的0,是由所有子元素中成对的2和5形成的,所以我们的思路就是统计出每个元素中可以提供的成对的2和5的个数

[代码实现]

package main

import "fmt"

func main() {
    input := 5
    result := computeResult(input)
    fmt.Println("result:", result)
}

func computeResult(input int) int {
    count2 := 0
    count5 := 0
    for i := 2; i < input + 1; i++ {
        count2 += _compute(2, i)
        count5 += _compute(5, i)
    }

    return min(count2, count5)
}

func min(a int, b int) int {
    if a < b {
        return a
    }

    return b
}

// 计算输入数字中包含目标数字的个数
func _compute(target int, input int) int {
    count := 0
    num := input
    for num % target == 0 {
        count++
        num = num / target
    }
    return count
}

Excel表列序号

[题目]

给定一个Excel表格中的列名称,返回其相应的列序号。

[输入1]

"A"

[返回1]

1

[输入2]

"AB"

[返回2]

28

[输入3]

"ZY"

[返回3]

701

[解法]

我们设想这样一个题目, 字符串 "123", 不使用强制类型转换,如何计算出对应的数字:

我们从头遍历,首先是 "1",将它转为1,此时结果result = 1,遍历到 "2",此时会result * 10 + 2, result = 12,遍历到 "3",此时会result * 10 + 3, result = 123,字母的转换和这个是一致的,只不过字母的进制位是26,而数字的进制位是10

[代码实现]

package main

import (
    "fmt"
    "strconv"
)

func main() {
    input := "ZY"
    result := computeResult(input)
    fmt.Println("result:", result)

    result2 := computeNum("321")
    fmt.Println("resultNum:", result2)
}

func computeResult(input string) int {
    items := []byte(input)
    result := 0
    for i := 0; i < len(items); i++ {
        item := items[i] - 'A' + 1
        result = result * 26 + int(item)
    }

    return result
}

func computeNum(input string) int {
    items := []byte(input)
    result := 0
    for i := 0; i < len(items); i++ {
        item, _ := strconv.Atoi(string(items[i]))
        result = result * 10 + item
    }
    return result
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-01-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农帮派 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档