算法通关村-----数字与数学基础问题

这篇具有很好参考价值的文章主要介绍了算法通关村-----数字与数学基础问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数字统计专题

符号统计

问题描述

已知函数 signFunc(x) 将会根据 x 的正负返回特定值:
如果 x 是正数,返回 1 。
如果 x 是负数,返回 -1 。
如果 x 是等于 0 ,返回 0 。
给你一个整数数组 nums 。令 product 为数组 nums 中所有元素值的乘积。
返回 signFunc(product) 。
详见leetcode1822

问题分析

最直接的方式是遍历nums数组,计算各个数的乘积,判断结果的正负。这样做计算量很大,而且很可能会发生溢出问题。根据乘法同号为正,异号为负的规则,只需统计数组中负数的个数,就能判断最终结果的正负,最后,只要数组中存在一个0,则最终结果为0

代码实现

public int arraySign(int[] nums) {
    int result = 1;
    for(int i=0;i<nums.length;i++){
        if(nums[i]==0){
            return 0;
        }else if(nums[i]<0){
            result = -result;
        }
    }
    return result;
}

统计阶乘尾数中的0

问题描述

设计一个算法,算出 n 阶乘有多少个尾随零。详见leetcode16.05

问题分析

直接计算阶乘结果,在统计结果中0的个数计算复杂,且可能会产生溢出问题。通过分析阶乘中的尾随0是由2(2的倍数)和5(5的倍数)运算产生的,而2(2的倍数出现的次数)总是大于5(5的倍数)出现的次数。所以,我们只需统计5(5的倍数出现的次数),就能统计阶乘结果的尾随0。

代码实现

public int trailingZeroes(int n) {
    int count = 0;
    while(n!=0){
        n /= 5;
        count += n;
    }
    return count;
}

溢出问题专题

整数反转

问题描述

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。

问题分析

如果不考虑溢出,我们可以直接先将x对10取余,得到尾数,将x/10去掉尾数,尾数不断✖️10加上新的尾数,可以实现反转效果。代码如下
public int reverse(int x) {
    int result = 0;
    while(x!=0){
        int temp = x%10;
        result = result*10 + temp;
        x = x/10;
    }
    return result;
}
很明显,反转后会出现数字溢出的问题。但是我们无法直接判断result>Integer.MAX_VALUE或者result<Integer.MIN_VALUE,因为此时result已经溢出了,我们可以判断result/10与最大值或者最小值除以10的关系,以最大值为例,当result/10>Integer.MAX_VALUE/10时,一定会溢出。当result/10<Integer.MAX_VALUE/10,此时下一轮不溢出,可以继续运算,当result/10==Integer.MAX_VALUE/10时,需要比较余数与Integer.MAX_VALUE%10的关系,余数>Integer.MAX_VALUE%10会溢出,否则不会溢出

代码实现

public int reverse(int x) {
    int result = 0;
    while(x!=0){
        int temp = x%10;
        if(result>Integer.MAX_VALUE/10 || (result==Integer.MAX_VALUE/10&& temp>Integer.MAX_VALUE%10)){
            return 0;
        }
        if(result<Integer.MIN_VALUE/10 || (result==Integer.MIN_VALUE/10&&temp<Integer.MIN_VALUE%10)){
            return 0;
        }
        result = result*10 + temp;
        x = x/10;
    }
    return result;
}

字符串转整数

在字符串专题已经详细分析实现,详见不简单的字符串转换

回文数的判断

问题描述

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。详见leetcode9

问题分析

如果直接将整数x反转比较,运算复杂,而且可能产生溢出问题,可以反转x的一半,如果x中的个数是奇数个,最中间的一个也可以反转,判断时不算在内即可。另外特殊情况,如x是负数,x的尾数为0的情况可以单独判断。

代码实现

public boolean isPalindrome(int x) {
    if(x<0){
        return false;
    }
    if(x%10==0 && x!=0){
        return false;
    }
    int reverse = 0;
    while(x>reverse){
        reverse = reverse*10 +x%10;
        x = x/10;
    }
    return reverse==x || reverse/10==x;
}

禁止专题

七进制数

问题描述

给定一个整数 num,将其转化为 7 进制,并以字符串形式输出。

问题分析

十进制转7禁止,可以对整数num进行不断对7取余,得到的余数反转,拼接得到最终结果,题目要求最终返回的结果是字符串,那么我们可以直接用字符转拼接。

代码实现

public String convertToBase7(int num) {
        if(num==0){
            return "0";
        }
        StringBuilder sb = new StringBuilder();
        boolean flag = true;
        if(num<0){
            flag = false;
            num *= -1;
        }
        while(num!=0){
            int temp = num%7;
            sb.append(temp);
            num = num/7;
        }
        if(!flag){
            sb.append("-");
        }
        return sb.reverse().toString();
    }

拓展:十进制转任意进制

问题描述

给定一个整数 num和一个数字n,将num转化为 n进制,并以字符串形式输出。

问题分析

思路和转换方式和上面是一样的,可自行体会代码实现

代码实现

public static String base10ToBaseN(int num, int n) {
    String[] numbers = new String[]{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"};
    boolean flag = true;
    StringBuilder sb = new StringBuilder();
    if (num < 0) {
        flag = false;
        num *= -1;
    }
    while (num != 0) {
        int temp = num % n;
        sb.append(numbers[temp]);
        num /= n;
    }
    if(!flag){
        sb.append("-");
    }
    return sb.reverse().toString();
}

总结

数字与数学问题要灵活运用取整,取余等操作获取数字,同时要注意溢出问题。

文章来源地址https://www.toymoban.com/news/detail-702827.html

到了这里,关于算法通关村-----数字与数学基础问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法基础-数学知识-欧拉函数、快速幂、扩展欧几里德、中国剩余定理

    互质就是两个数的最大公因数只有1,体现到代码里面就是 a和b互质,则b mod a = 1 mod a (目前我不是很理解,但是可以这样理解:a和b的最大公因数是1,即1作为除数和b作为除数时,对于被除数a来说余数是一样的,即1/a的余数和b/a是一样的,即 b mod a = 1 mod a ) 欧拉函数的作用是

    2024年02月09日
    浏览(45)
  • 【算法基础 & 数学】快速幂求逆元(逆元、扩展欧几里得定理、小费马定理)

    原文链接 首先,在算法竞赛中,很多情况下会遇到数值很大的数据,这个时候,题目往往会让我们对某个数去摸,来控制数据范围。 在±*运算中,我们可以对每个数单独取模,然后再对运算之后的数取模。 但是除法比较特殊,例如: ( 40 ÷ 5 ) m o d 10 ≠ ( ( 40 m o d 10 ) ÷ ( 5

    2024年01月23日
    浏览(49)
  • 【人工智能的数学基础】最优传输(Optimal Transport)问题与Wasserstein距离

    Wasserstein Distance. 本文目录: 最优传输问题 Optimal Transport Problem 最优传输问题的对偶问题 Dual Problem Wasserstein距离及其对偶形式 对于两个概率分布 p ( x ) p(textbf{x})

    2024年02月09日
    浏览(45)
  • 数学建模基础算法Chapter2.1 -- 整数规划(ILP): 分支定界+割平面

    By 进栈需检票 当题目要求的最优解是整数,例如物件的数量,参与人员的数量等时,就不能继续使用之前的线性规划了(当出现小数的情况),这个时候需考虑整数规划这样的一种建模形式 但是目前所流行的求整数规划的方法,只适用于整数线性规划,不能解决一切的整数

    2024年02月12日
    浏览(54)
  • AI 大模型 LLM 的基础概念、核心算法原理数学模型和发展历史及其应用领域

    LLM(Large Language Model)是一种大型自然语言处理模型,它基于深度学习技术,通过大规模预训练和微调的方式来完成各种自然语言处理任务。下面我们简要介绍 LLM 模型的发展历史以及应用领域。 在过去的几年中,许多研究人员不断地探索着更加高效的深度学习算法和模型架

    2024年02月10日
    浏览(48)
  • 有趣的数学 数学建模入门二 一些理论基础

             现实世界中混乱的问题可以用数学来解决,从而产生一系列可能的解决方案来帮助指导决策。大多数人对数学建模的概念感到不舒服,因为它是如此开放。如此多的未知信息似乎令人望而却步。哪些因素最相关?但正是现实世界问题的这种开放性导致了解决问题

    2024年02月10日
    浏览(46)
  • 人工智能基础部分24-人工智能的数学基础,汇集了人工智能数学知识最全面的概况

    、 大家好,我是微学AI,今天给大家介绍一下人工智能基础部分24-人工智能的数学基础,汇集了人工智能数学知识最全面的概况,深度学习是一种利用多层神经网络对数据进行特征学习和表示学习的机器学习方法。要全面了解深度学习的数学基础,需要掌握这些数学知识:向

    2024年02月21日
    浏览(75)
  • 第一章 数学基础

    理解范数概念 区分向量的内积 a ⋅ b mathbf{a} cdot mathbf{b} a ⋅ b 与外积 a × b mathbf{a} times mathbf{b} a × b 区分矩阵的乘法 A ⊗ B mathbf{A} otimes mathbf{B} A ⊗ B 、内积 A B mathbf{A} mathbf{B} AB 、哈达玛积 A ⊙ B mathbf{A} odot mathbf{B} A ⊙ B 向量 向量是一组标量排列而成的,只有一个

    2024年02月06日
    浏览(54)
  • UnityShader(三)数学基础

    目录 前言 一、笛卡尔坐标系(Cartesian Coordinate System) 1.二维笛卡尔坐标系 2.三维笛卡尔坐标系 2.1.左手坐标系(left-handed coordinate space) 判断左手坐标系的方法: 判断左手坐标系的正向旋转(左手法则【left-hand rule】) 2.2.右手坐标系(right-handed coordinate space) 判断右手坐标

    2024年02月03日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包