数学逻辑专题


不要纠结,干就完事了,熟练度很重要!!!多练习,多总结!!!

分治篇

LeetCode 263. 丑数

在这里插入图片描述

解题思路

为判断 nnn 是否满足上述形式,可以对 nnn 反复除以 2,3,52,3,52,3,5,直到 nnn 不再包含质因数 2,3,52,3,52,3,5。若剩下的数等于 111,则说明 nnn 不包含其他质因数,是丑数;否则,说明 nnn 包含其他质因数,不是丑数。

代码实现

class Solution {
    public boolean isUgly(int n) {
        if(n < 1){
            return false;
        }
        int[] fac = {2, 3, 5};
        for(int c : fac){
            while(n%c == 0){
                n = n/c;
            }
        }
        return n==1;
    }
}

LeetCode 69. x 的平方根

在这里插入图片描述

解题思路

二分查找的下界为 000,上界可以粗略地设定为 xxx。在二分查找的每一步中,我们只需要比较中间元素 mid 的平方与 xxx 的大小关系,并通过比较的结果调整上下界的范围。由于我们所有的运算都是整数运算,不会存在误差,因此在得到最终的答案 ans 后,也就不需要再去尝试 ans+1 了。

代码实现

class Solution {
    public int mySqrt(int x) {
        if(x==0){
            return 0;
        }
        long left=1,right=x;
        while(left<=right){
            long mid=left+(right-left)/2;
            if(mid*mid<x){
                left=mid+1;
            }else if(mid*mid>x){
                right=mid-1;
            }else{
                return (int)mid;
            }
        }
        return (int)right;

    }
}

LeetCode 7. 整数反转

在这里插入图片描述

代码实现

public int reverse (int x) {
    int res = 0;
    while (x != 0) {
        int c =  x % 10;
        //判断当前字符加入结果集是否超限
        if (res > 0 && isOutMax(res, c))return 0;
        if (res < 0 && isOutMin(res, c))return 0;

        res = res * 10 + c;
        //倒数下一位
        x /= 10;

    }
    return res;
}

private boolean isOutMax(int target, int c) {
    if (target > Integer.MAX_VALUE / 10) return true;
    return target == Integer.MAX_VALUE / 10 && c  > Integer.MAX_VALUE % 10;
}
private boolean isOutMin(int target, int c) {
    if (target < Integer.MIN_VALUE / 10) return true;
    //注意取反比较
    return  target == Integer.MIN_VALUE / 10 &&
            (c - '0') > -(Integer.MIN_VALUE % 10);
}

LeetCode 179. 最大数

在这里插入图片描述

代码实现

class Solution {
    public String largestNumber(int[] nums) {
        int n = nums.length;
        String[] ss = new String[n];
        for (int i = 0; i < n; i++) ss[i] = "" + nums[i];
        Arrays.sort(ss, (a, b) -> {
            String sa = a + b, sb = b + a ;
            return sb.compareTo(sa);
        });
        
        StringBuilder sb = new StringBuilder();
        for (String s : ss) sb.append(s);
        int len = sb.length();
        int k = 0;
        while (k < len - 1 && sb.charAt(k) == '0') k++;
        return sb.substring(k);
    }
}

LeetCode 166. 分数到小数

在这里插入图片描述

代码实现

class Solution {
    public String fractionToDecimal(int numerator, int denominator) {
        // 转 long 计算,防止溢出
        long a = numerator, b = denominator;
        // 如果本身能够整除,直接返回计算结果
        if (a % b == 0) return String.valueOf(a / b);
        StringBuilder sb = new StringBuilder();
        // 如果其一为负数,先追加负号
        if (a * b < 0) sb.append('-');
        a = Math.abs(a); b = Math.abs(b);
        // 计算小数点前的部分,并将余数赋值给 a
        sb.append(String.valueOf(a / b) + ".");
        a %= b;
        Map<Long, Integer> map = new HashMap<>();
        while (a != 0) {
            // 记录当前余数所在答案的位置,并继续模拟除法运算
            map.put(a, sb.length());
            a *= 10;
            sb.append(a / b);
            a %= b;
            // 如果当前余数之前出现过,则将 [出现位置 到 当前位置] 的部分抠出来(循环小数部分)
            if (map.containsKey(a)) {
                int u = map.get(a);
                return String.format("%s(%s)", sb.substring(0, u), sb.substring(u));
            }
        }
        return sb.toString();
    }
}

LeetCode 204. 计数质数

在这里插入图片描述

解题思路

埃氏筛方法
在这里插入图片描述
在这里插入图片描述

代码实现

法一:常规方法

class Solution {
    public int countPrimes(int n) {
        int cnt = 0;
        for (int i = 2; i < n; i++) {
            if (isPrime(i)) {
                cnt++;
            }
        }
        return cnt;
    }

    private boolean isPrime(int num) {
        int max = (int)Math.sqrt(num);
        for (int i = 2; i <= max; i++) {
            if (num % i == 0) {
                return false;
            }
        }
        return true;
    }
}

法二:埃氏筛

class Solution {
    
    public int countPrimes(int n) {
        boolean[] isPrim = new boolean[n];
        Arrays.fill(isPrim, true);
        // 从 2 开始枚举到 sqrt(n)。
        for (int i = 2; i * i < n; i++) {
            // 如果当前是素数
            if (isPrim[i]) {
                // 就把从 i*i 开始,i 的所有倍数都设置为 false。
                for (int j = i * i; j < n; j+=i) {
                    isPrim[j] = false;
                }
            }
        }

        // 计数
        int cnt = 0;
        for (int i = 2; i < n; i++) {
            if (isPrim[i]) {
                cnt++;
            }
        }
        return cnt;
    }
}

总结

本题来源于Leetcode中 归属于数学逻辑专题类型题目。
同许多在算法道路上不断前行的人一样,不断练习,修炼自己!
如有博客中存在的疑问或者建议,可以在下方留言一起交流,感谢各位!

觉得本博客有用的客官,可以给个点赞+收藏哦! 嘿嘿

喜欢本系列博客的可以关注下,以后除了会继续更新面试手撕代码文章外,还会出其他系列的文章!

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 《面向计算机科学的数理逻辑》是一本关于计算机科学中数理逻辑的PDF教材。该教材主要介绍了数理逻辑在计算机科学中的应用。数理逻辑是研究推理和证明的数学分支,它为计算机科学提供了强大的推理和证明工具。 该教材首先介绍了数理逻辑的基本概念和符号表示法,如命题逻辑、一阶逻辑和模态逻辑等。然后,它详细讨论了计算机科学中常见的逻辑问题,例如逻辑推理、谓词逻辑、等价性和可满足性等。通过学习这些内容,读者将能够理解和应用逻辑工具来解决计算机科学领域中的问题。 除了介绍基本概念和问题,教材还提供了大量的例子和习题,帮助读者加深对数理逻辑的理解。通过解答这些习题,读者可以巩固所学知识,并学会将数理逻辑应用于实际问题中。 此外,该教材还介绍了一些计算机科学中常用的逻辑工具和技术,如形式化验证和模型检测等。这些技术可以帮助计算机科学家在设计和开发复杂系统时,检测错误和验证系统的正确性。 总之,《面向计算机科学的数理逻辑》是一本有关数理逻辑在计算机科学领域的应用的教材。通过学习这本教材,读者将能够理解和应用数理逻辑的基本概念和工具,以及掌握一些逻辑分析和验证的技巧。这对于研究和开发计算机科学领域的复杂系统非常有价值。 ### 回答2: 面向计算机科学的数理逻辑是一本关于数理逻辑在计算机科学中应用的重要参考书。它介绍了数理逻辑的基本概念和原理,以及在计算机科学中的应用。这本书对于从事计算机科学研究和相关领域的学生和专业人士来说是一本非常有价值的资料。 该书首先介绍了命题逻辑和谓词逻辑的基本概念和推理规则。它解释了命题逻辑中的真值表、合取范式、析取范式等重要概念,并讲解了它们在计算机科学中的应用。此外,该书还涉及到了一阶逻辑的形式化语言,如规则、谓词和函数等的定义和使用。 此外,该书还介绍了集合论和图论等数学工具在计算机科学中的应用。它详细讨论了集合的基本操作,如并集、交集和差集,并说明了它们在数据结构和数据库等领域的重要性。此外,该书还着重介绍了图的基本概念和算法,包括最短路径算法、最小生成树算法和拓扑排序算法等。 通过阅读这本书,读者可以了解到数理逻辑在计算机科学中的重要性和应用。它不仅帮助读者提高逻辑思维能力,还可以帮助他们理解和分析计算机科学中的问题。此外,该书还提供了大量的例子和习题,帮助读者巩固所学知识,并能够灵活运用到实际问题中。 总之,面向计算机科学的数理逻辑是一本对于计算机科学学习者和研究人员来说非常有价值的书籍。它系统地介绍了数理逻辑的基本概念和原理,并介绍了它们在计算机科学中的应用。通过阅读这本书,读者可以提高逻辑思维能力,并能够灵活运用数理逻辑解决计算机科学问题。 ### 回答3: 面向计算机科学的数理逻辑 pdf 是一本以计算机科学为背景的数理逻辑教材。数理逻辑是研究逻辑系统和推理规则的数学学科,它在计算机科学中起着重要的作用。 这本 pdf 面向的主要读者是计算机科学专业的学生和从事相关研究的人员。它可以作为大学本科或研究生课程的教材,也可供自学使用。这本教材的目标是帮助读者建立对数理逻辑基本原理和方法的深入理解,并将其运用到计算机科学领域中的问题中。 该教材的内容主要包括命题逻辑、谓词逻辑和模态逻辑等方面的知识。它从基础概念开始,逐步引入更深入复杂的内容,包括公理系统、推理规则、证明方法、语义解释和模型论等。此外,教材还涵盖了一些与计算机科学相关的专题,如程序验证、形式化验证以及人工智能中的逻辑推理等。 通过学习这本教材,读者将能够掌握数理逻辑的核心概念和基本方法,并能够运用这些知识解决现实世界中的计算机科学问题。它将帮助读者培养严密的逻辑思维和分析能力,以及解决复杂问题的能力。 总之,面向计算机科学的数理逻辑 pdf 是一本重要的教材,它为学习者提供了丰富的数理逻辑知识,并帮助他们将这些知识应用于计算机科学领域。这本教材对于培养计算机科学专业人员的逻辑思维和问题解决能力具有重要意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值