[Go版]算法通关村第十三关青铜——数字数学问题之统计问题、溢出问题、进制问题

这里写自定义目录标题


很多数学相关算法的关键在于找到怎么通过最简洁的方式来解决问题,而不是硬算。

数字统计专题

题目:数组元素积的符号

题目链接:LeetCode-1822. 数组元素积的符号
在这里插入图片描述

思路分析:无需真计算,只需判断负数个数是奇是偶

复杂度:时间复杂度 O ( n ) O(n) O(n)、空间复杂度 O ( 1 ) O(1) O(1)

Go代码

func arraySign(nums []int) int {
    ret := 1
    for _, v := range nums {
        if v == 0 {
            return 0
        }
        if v < 0 {
            ret = -ret
        }
    }
    return ret
}

题目:阶乘尾数0的个数

题目链接:LeetCode-面试题 16.05. 阶乘尾数
在这里插入图片描述

思路分析:2和5能凑出1个0,而2出现的次数一定多于5,所以统计5的出现次数即可

复杂度:时间复杂度 O ( l o g n ) O(logn) O(logn)、空间复杂度 O ( 1 ) O(1) O(1)

Go代码

func trailingZeroes(n int) int {
    num := 0
    for n > 0 {
        n = n/5
        num += n
    }
    return num
}

溢出问题专题

题目:整数反转

题目链接:LeetCode-7. 整数反转
在这里插入图片描述

思路分析:依次除10得到余数进行值组装,注意溢出问题

复杂度:时间复杂度 O ( l o g n ) O(log n) O(logn)、空间复杂度 O ( 1 ) O(1) O(1)

Go代码

func reverse(x int) int {
    res := 0
    for x != 0 {
        // 获得末尾数字
        num := x%10
        // 判断是否大于最大整数
        if res > 0 && res > (math.MaxInt32-num)/10 {
            return 0 
        }
        // 判断是否小于最小整数
        if res <0 && res < (math.MinInt32-num)/10 {
            return 0
        }
        res = res*10 + num
        x = x/10
    }
    return res
}

题目:字符串转换整数 (atoi)

题目链接:LeetCode-8. 字符串转换整数 (atoi)
在这里插入图片描述

思路分析:去除空格 + 确定正负 + 读取数值 + 判断溢出

复杂度:时间复杂度 O ( n ) O(n) O(n)、空间复杂度 O ( 1 ) O(1) O(1)

Go代码

func myAtoi(s string) int {
    if len(s) == 0 {
        return 0
    }
    // 去除前面空格
    for i, v := range s {
        if v != ' ' {
            s = s[i:]
            break
        }
    }
    if len(s) == 0 {
        return 0
    }
    // 确定正负
    sign := 1
    if s[0] == '-' || s[0] == '+' {
        if s[0] == '-' {
            sign = -1
        }
        s = s[1:]
    }
    res, v := 0, 0
    length := len(s)
    // 读取数值
    for i:=0; i<length; i++ {
        if s[i] < '0' || s[i] > '9' {
            return res
        }
        v = int(s[i]-'0')
        // 判断越界
        if res > (math.MaxInt32-v)/10 {
            return math.MaxInt32
        }
        if res < (math.MinInt32+v)/10 {
            return math.MinInt32
        }
        res = res * 10 + sign * v
    }
    return res
}

题目:回文数

题目链接:LeetCode-9. 回文数
在这里插入图片描述

解法1:反转数字后对比是否一致,反转过程注意溢出问题

复杂度:时间复杂度 O ( l o g n ) O(log n) O(logn)、空间复杂度 O ( 1 ) O(1) O(1)

Go代码

func isPalindrome(x int) bool {
    if x < 0 {
        return false
    }
    num := 0
    oldx := x
    newx := 0
    for x != 0 {
        num = x%10  //尾数
        if newx > (math.MaxInt32-num)/10 || newx < (math.MinInt32-num)/10 {
            return false
        }
        newx = newx*10 + num
        x = x/10
    }
    if newx == oldx {
        return true
    }
    return false
}

解法2:仅反转一半位数后对比是否一致,对比过程注意奇数位数的问题,但不用考虑溢出问题了(优化解法1)

复杂度:时间复杂度 O ( l o g n ) O(log n) O(logn)、空间复杂度 O ( 1 ) O(1) O(1)

Go代码

func isPalindrome(x int) bool {
    // 负数 和 余数是0但是本身不是0 时
    if x < 0  || (x%10==0 && x != 0) {
        return false
    }
    num := 0
    // 反转一半
    for x > num {
        num = num*10 + x%10
        x = x/10
    }
    // 考虑奇位数时,忽略中间数,比如12321 中的3
    if x == num || x == num/10 {
        return true
    }
    return false
}

进制专题

题目:七进制数

题目链接:LeetCode-504. 七进制数
在这里插入图片描述

思路分析:依次出7的余数,拼接后反转,注意拼接时负号要追加上

复杂度:时间复杂度 O ( l o g ∣ n ∣ ) O(log |n|) O(logn)、空间复杂度 O ( l o g ∣ n ∣ ) O(log |n|) O(logn)

Go代码

func convertToBase7(num int) string {
    if num == 0 {
        return "0"
    }
    sign := 1
    if num < 0 {
        sign = -1
        // 绝对值num
        num = -1 * num
    }
    res := make([]byte, 0)
    var v byte
    for num != 0 {
        // 余数依次是反转的原值
        v = byte(num%7 + '0')
        res = append(res, v)
        num = num/7
    }
    if sign < 0 {
        res = append(res, '-')
    }
    reverseArr(res, 0, len(res)-1)
    return string(res)
}
func reverseArr(arr []byte, left int, right int) {
    if left >= right {
        return
    }
    for left <= right {
        arr[left], arr[right] = arr[right], arr[left]
        left++
        right--
    }
}

题目:十进制转换为指定进制

给定一个十进制数Num,以及需要转换的进制数N,将十进制数Num转化为N进制数。Num是32为整数,2<=N<=16。

思路分析:准备16进制的字符Map,依次除N得到余数,映射Map得到对应字符,追加到数组,注意负号的追加,反转数组,转为string

复杂度:时间复杂度 O ( l o g n u m ) O(log num) O(lognum)、空间复杂度 O ( l o g n u m ) O(log num) O(lognum)

Go代码

func convert(num int, n int) string {
    byteArr := [16]byte{'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}
    if num == 0 {
        return "0"
    }
    sign := 1
    if num < 0 {
        sign = -1
        num = -num
    }
    res := []byte{}
    var v byte
    for num != 0 {
        v = byteArr[num%n]
        res = append(res, v)
        num = num/n
    }
    if sign == -1 {
        res = append(res, '-')
    }
    reverse(res, 0, len(res)-1)
    return string(res)
}
func reverse(arr []byte, left int, right int) {
    if left >= right {
        return
    }
    for left <= right {
        arr[left], arr[right] = arr[right], arr[left]
        left++
        right--
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/83258.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高忆管理:市盈率一般多少合理?

市盈率&#xff08;PE Ratio&#xff09;是衡量一只股票估值水平的重要目标&#xff0c;其计算公式为股票当前市价除以每股收益。一般来说&#xff0c;市盈率较低的股票被认为是具有出资价值的好股票&#xff0c;而市盈率较高的股票则或许被认为是过度投机或者受商场热潮影响的…

我国55个少数民族及主要分布地区

声明&#xff1a;来源网络&#xff0c;仅供学习&#xff01;

漏洞指北-VulFocus靶场专栏-中级02

漏洞指北-VulFocus靶场专栏-中级02 中级005 &#x1f338;thinkphp lang 命令执行&#xff08;thinkphp:6.0.12&#xff09;&#x1f338;step1&#xff1a;burp suite 抓包 修改请求头step2 修改成功&#xff0c;访问shell.php 中级006 &#x1f338;Metabase geojson任意文件…

商用汽车转向系统常见故障解析

摘要&#xff1a; 车辆转向系统是用于改变或保持汽车行驶方向的专门机构。其作用是使汽车在行驶过程中能按照驾驶员的操纵意图而适时地改变其行驶方向&#xff0c;并在受到路面传来的偶然冲击及车辆意外地偏离行驶方向时&#xff0c;能与行驶系统配合共同保持车辆继续稳定行驶…

构建 NodeJS 影院预订微服务并使用 docker 部署(03/4)

一、说明 构建一个微服务的电影网站&#xff0c;需要Docker、NodeJS、MongoDB&#xff0c;这样的案例您见过吗&#xff1f;如果对此有兴趣&#xff0c;您就继续往下看吧。 你好社区&#xff0c;这是&#x1f3f0;“构建 NodeJS 影院微服务”系列的第三篇文章。本系列文章演示了…

敏感信息泄露

由于后台人员的疏忽或者不当的设计&#xff0c;导致不应该被前端用户看到的数据被轻易的访问到。 比如&#xff1a; —通过访问url下的目录&#xff0c;可以直接列出目录下的文件列表; —输入错误的url参数后报错信息里面包含操作系统、中间件、开发语言的版本或其他信息; —前…

不同企业如何选择合适的CRM系统?

市场上的CRM系统千差万别&#xff0c;如何选到适合的CRM系统&#xff1f;很多企业凭借感觉盲目选型&#xff0c;结果上线后发现CRM系统功能不符合需求。这就好比买衣服&#xff0c;不试穿就买回家&#xff0c;结果发现尺码不合适&#xff0c;还不能退换。下面说说企业如何进行C…

恒运资本:信创概念再度活跃,华是科技再创新高,南天信息等涨停

信创概念21日盘中再度活跃&#xff0c;截至发稿&#xff0c;华是科技涨超17%&#xff0c;盘中一度触及涨停再创新高&#xff0c;中亦科技涨超13%亦创出新高&#xff0c;久其软件、南天信息、新炬网络、英飞拓均涨停。 音讯面上&#xff0c;自8月3日以来&#xff0c;财政部官网连…

async/await 编程理解

博客主要是参考 Asynchronous Programming in Rust &#xff0c;会结合简单的例子&#xff0c;对 async 和 await 做比较系统的理解&#xff0c;如何使用 async 和 await 是本节的重点。 async 和 await 主要用来写异步代码&#xff0c;async 声明的代码块实现了 Future 特性&a…

openLayers实战(九):正多边形的绘制

最近在绘制各种图形&#xff0c;越来越乱&#xff0c;看了很多文章&#xff0c;启发了从最最基础的图形开始学习扩展。 遇到什么样的问题&#xff1f; import ol from "ol"; import { Draw } from "ol/interaction"; import { Vector as VectorSource } f…

React 之 Router - 路由详解

一、Router的基本使用 1. 安装react-router react-router会包含一些react-native的内容&#xff0c;web开发并不需要 npm install react-router-dom 2. 设置使用模式 BrowserRouter或HashRouter Router中包含了对路径改变的监听&#xff0c;并且会将相应的路径传递给子组件Bro…

学习笔记230804---restful风格的接口,delete的传参方式问题

如果后端提供的删除接口是restful风格&#xff0c;那么使用地址栏拼接的方式发送请求&#xff0c;数据放在主体中&#xff0c;后端接受不到&#xff0c;当然也还有一种可能&#xff0c;后端在这个接口的接参设置上是req.query接参。 问题描述 今天遇到的问题是&#xff0c;de…

BladeX多数据源配置

启用多租户数据库隔离&#xff0c;会默认关闭mybatis-plus多数据源插件的启动&#xff0c;从而使用自定义的数据源识别 若不需要租户数据库隔离只需要字段隔离&#xff0c;而又需要用到多数据源的情况&#xff0c;需要前往LauncherService单独配置 数据源切换失败 详情请看说明…

windows ipv4 多ip地址设置,默认网关跃点和自动跃点是什么意思?(跃点数)

文章目录 Windows中的IPv4多IP地址设置以及默认网关跃点和自动跃点的含义引言IPv4和IPv6&#xff1a;简介多IP地址设置&#xff1a;Windows环境中的实现默认网关跃点&#xff1a;概念和作用自动跃点&#xff1a;何时使用&#xff1f;关于“跃点数”如何确定应该设置多少跃点数&…

快速入门vue3组合式API

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 使用create-vue创建项目 熟悉项目目录和关键文件 组合式API setup选项 setup选项的写法和执行时机 s…

linux 安装 kibana

首先下载 kibana https://www.elastic.co/cn/downloads/kibana 然后上传到linux /usr/local 目录下解压安装 修改config/kibana.yml 配置文件&#xff0c;将elasticsearch.hosts 然后再nginx 中做一个端口映射&#xff0c;实现在浏览器中输入后xxxx:5602 nginx 可以将请求转发…

02-前端基础第二天-HTML5

01-HTML标签&#xff08;下&#xff09;导读 目标&#xff1a; 能够书写表格能够写出无序列表能够写出3~4个常用input表单类型能够写出下拉列表表单能够使用表单元素实现注册页面能够独立查阅W3C文档 目录&#xff1a; 表格标签列表标签表单标签综合案例查阅文档 02-表格标…

使用VSCode配置简单的vue项目

由于最近要使用的项目框架为前后端分离的&#xff0c;采用的是vue.jswebAPI的形式进行开发的。因为之前我没有接触过vue.js&#xff0c;也只是通过视频文档做了一些简单的练习。今天技术主管说让大家熟悉下VSCode开发vue&#xff0c;所以自己摸索了好久&#xff0c;才算是把简单…

矩阵乘法(C++ mpi 并行实现)

矩阵乘法有2种思路&#xff0c;我最先想到的是第一种思路&#xff0c;但是时间、空间复杂度都比较高。后面参考了一些资料&#xff0c;实现了第二种思路。 一、思路1&#xff1a;按行、列分块 矩阵乘法有一个很好的性质&#xff0c;就是结果矩阵的每个元素是不互相依赖的&…

AIGC音视频工具分析和未来创新机会思考

编者按&#xff1a;相较于前两年&#xff0c;2023年音视频行业的使用量增长缓慢&#xff0c;整个音视频行业遇到瓶颈。音视频的行业从业者面临着相互竞争、不得不“卷”的状态。我们需要进行怎样的创新&#xff0c;才能从这种“卷”的状态中脱离出来&#xff1f;LiveVideoStack…