数字的位操作——7、9、479、564、231、342

news2024/9/21 10:55:29

7. 整数反转(中等)

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

示例 1:

输入:x = 123
输出:321

示例 2:

输入:x = -123
输出:-321

示例 3:

输入:x = 120
输出:21

示例 4:

输入:x = 0
输出:0

提示:

  • -231 <= x <= 231 - 1

解法一、字符串操作,考虑多种情况模拟 (16mins)

复杂但不烧脑。。参考了之前一道题的边界讨论方式(即这里的bound),正负数需要分开辨别。用了StringBuffer的reverse API

使用负号记录,转换时不考虑负号,避免长度出问题(而且翻转后负号会去后面)。长度>10,越界。长度<10,三目讨论正负。长度等于10,分正负号讨论是否越界。

class Solution {
    public static int reverse(int x) {
        boolean negative = false;
        if(x < 0){
            negative = true;
            x = Math.abs(x);
        }
        StringBuffer sb = new StringBuffer(String.valueOf(x)).reverse();
        int bound = Integer.MAX_VALUE / 10;//原十位 这里九位
        if(sb.length() > 10){
            return 0;
        }else if(sb.length() <= 9){
            return negative ? -Integer.parseInt(sb.toString()):Integer.parseInt(sb.toString());
        }else{
            if(Integer.parseInt(sb.toString().substring(0,9)) > bound){
                return 0;
            }else if(Integer.parseInt(sb.toString().substring(0,10)) < bound){
                return negative ? -Integer.parseInt(sb.toString()):Integer.parseInt(sb.toString());
            }else{
                    if((negative && sb.toString().charAt(9) - '8' > 0 )|| (!negative && sb.toString().charAt(9) - '7' > 0 )){
                        return 0;
                    }else{
                        return negative ? -Integer.parseInt(sb.toString()):Integer.parseInt(sb.toString());
                }
            }
        }
    }
}

解法二、循环取数

这里观看评论区,有以下收获:

  • 由于原始int数据,例如对于2147483647(最大情况),原数据不溢出、翻转后可以溢出的,一定是类似22*******1/2的情况。总之,尾数一定是1或者2,就不必再考虑tmp>7和<-8,因为数据限制。
  • 因为这里是手动转int,不使用Integer.valueOf api的话,就可以规避报错。所以,比起转换途中考虑是否溢出,不如直接转换完毕之后讨论是否溢出,是一个非常灵巧的逆向思维。而转换的方式就是last == res / 10(last是上一步的结果,res是这一步的结果),如果溢出,显然就不相等了。也就是说,考虑溢出确实是重要的,但利用溢出也很重要。
  • 模不能是负数,但负数可以取模。余数符号与被模数相同。
class Solution {
    public int reverse(int x) {
        int res = 0;
        while(x!=0) {
            //每次取末尾数字
            int tmp = x%10;
            //判断是否 大于 最大32位整数
            if (res>214748364 || (res==214748364 && tmp>7)) {
                return 0;
            }
            //判断是否 小于 最小32位整数
            if (res<-214748364 || (res==-214748364 && tmp<-8)) {
                return 0;
            }
            res = res*10 + tmp;
            x /= 10;
        }
        return res;
    }
}			

作者:王尼玛
链接:https://leetcode.cn/problems/reverse-integer/solutions/211865/tu-jie-7-zheng-shu-fan-zhuan-by-wang_ni_ma/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 
9. 回文数(简单)

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数

是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

  • 例如,121 是回文,而 123 不是。

示例 1:

输入:x = 121
输出:true

示例 2:

输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例 3:

输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。

提示:

  • -231 <= x <= 231 - 1

进阶:你能不将整数转为字符串来解决这个问题吗?

解法一  翻转再比对(3mins)

先转换再考虑相等。如果原数不溢出,转换数肯定也不溢出。感觉数字比字符串的回文好算的缘故是可以直接比对,不好算的缘故是无法精确且迅速地取下标

class Solution {
    public static boolean isPalindrome(int x) {
        if(x < 0)return false;
        int t = x;
        int res = 0;
        while(x!=0){
            int temp = x %10;
            res = res * 10 + temp;
            x /=10;
        }
        return t == res ? true:false;
    }
}

 

解法二 解法一优化

本质上和解法一是一样的,但是①不需要声明额外变量②return里用||和/10来去除奇数位时翻转数中位的思想很天才。如,原数字是12321,处理后变成x=12 翻转数 =123 这个3不需要辨识,它总与自身相等。

while循环的条件:处理一半(即翻转一半)就足够考虑是否相等了。

class Solution {
    public boolean isPalindrome(int x) {
        // 特殊情况:
        // 如上所述,当 x < 0 时,x 不是回文数。
        // 同样地,如果数字的最后一位是 0,为了使该数字为回文,
        // 则其第一位数字也应该是 0
        // 只有 0 满足这一属性
        if (x < 0 || (x % 10 == 0 && x != 0)) {
            return false;
        }

        int revertedNumber = 0;
        while (x > revertedNumber) {
            revertedNumber = revertedNumber * 10 + x % 10;
            x /= 10;
        }

        // 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。
        // 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,
        // 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。
        return x == revertedNumber || x == revertedNumber / 10;
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/palindrome-number/solutions/281686/hui-wen-shu-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 解法三、评论区的拉马努金解法

默默地服了。。

class Solution {
    public boolean isPalindrome(int x) { 
        if(x==1122||x==123123||x==1000021||x==21120||x<0)return false;
        if(x<10&&x>=0||x%11==0||x==313||x==101||x==88888||x==2222222)return true;     
        else return false;          
    } 
}

479. 最大回文数乘积(困难)

给定一个整数 n ,返回 可表示为两个 n 位整数乘积的 最大回文整数 。因为答案可能非常大,所以返回它对 1337 取余 。

示例 1:

输入:n = 2
输出:987
解释:99 x 91 = 9009, 9009 % 1337 = 987

示例 2:

输入:n = 1
输出:9

提示:

  • 1 <= n <= 8

解法一、暴力枚举

没感觉到任何这道题配是困难的地方。证明也很粗糙。。直奔题解了。原思路是二重循环转字符串开乘,感觉很艰涩,不过这个字符串乘法模板还挺有意思的。总感觉和之前做过的一道题有点像。。

字符串乘法模板
    public String multiplyStrings(String num1, String num2) {
        int m = num1.length(), n = num2.length();
        int[] pos = new int[m + n];

        for (int i = m - 1; i >= 0; i--) {
            for (int j = n - 1; j >= 0; j--) {
                int mul = (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
                int sum = mul + pos[i + j + 1];

                pos[i + j] += sum / 10;
                pos[i + j + 1] = sum % 10;
            }
        }

        StringBuilder sb = new StringBuilder();
        for (int p : pos) {
            if (!(sb.length() == 0 && p == 0)) {
                sb.append(p);
            }
        }

        return sb.length() == 0 ? "0" : sb.toString();
    }
题解

其实就是对于n位数相乘,上限2n位,往下找回文串。不用确认是不是回文,直接确定左面造右面。 甚至还用了long,不讲武德。。83ms,居然没有超时

class Solution {
    public int largestPalindrome(int n) {
        if (n == 1) return 9;
        int max = (int) Math.pow(10, n) - 1;
        for (int i = max; i >= 0; i--) {
            long num = i, t = i;
            while (t != 0) {
                num = num * 10 + (t % 10);
                t /= 10;
            }
            for (long j = max; j * j >= num; j--) {
                if (num % j == 0) return (int)(num % 1337);
            }
        }
        return -1;
    }
}

作者:宫水三叶
链接:https://leetcode.cn/problems/largest-palindrome-product/solutions/1424568/by-ac_oier-t8j7/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

解法二、你说得对,但我打表

class Solution {
    static int[] ans = new int[]{9,987,123,597,677,1218,877,475};
    public int largestPalindrome(int n) {       
        return ans[n - 1];
    }
}

564. 寻找最近的回文数(困难)

给定一个表示整数的字符串 n ,返回与它最近的回文整数(不包括自身)。如果不止一个,返回较小的那个。

“最近的”定义为两个整数差的绝对值最小。

示例 1:

输入: n = "123"
输出: "121"

示例 2:

输入: n = "1"
输出: "0"
解释: 0 和 2是最近的回文,但我们返回最小的,也就是 0。

提示:

  • 1 <= n.length <= 18
  • n 只由数字组成
  • n 不含前导 0
  • n 代表在 [1, 1018 - 1] 范围内的整数

解法一、暴力枚举

假如例子是12345,那么取出123,造一个100001,造一个9999,造一个12221,造一个12321,造一个12421,比较五个里哪个差值最小。

是long,它用了long魔法jpg

看评论区说是字节三面。感觉这种形式暴力出来的题真的很有用吗。。甚至写完都没感觉到有特别能讲的地方

倒是明显感觉到边界处理进步了很多,造轮子速度也快了

class Solution {
    public static String nearestPalindromic(String n) {
        int len = n.length();
        long cur = Long.parseLong(n);
        Set<Long> res = new HashSet<>();
        res.add((long)Math.pow(10,len) +1);
        res.add((long)Math.pow(10,len-1) -1);
        long t = Long.parseLong(n.substring(0,(len+1)/2));
        for(long i = t-1;i <= t+1;i++){
            long temp = getNum(i,len % 2 == 0);
            if(temp != cur){
                res.add(temp);
            }
        }
        long r = -1;
        long min = Long.MAX_VALUE;
        for(long num : res){
            if(r == -1)r = num;
            if(Math.abs(num - cur) < min){
                min = Math.abs(num - cur);
                r = num;
            }else if(Math.abs(num - cur) == min && num < r){
                r = num;
            }
        }
        return String.valueOf(r);
    }
    public static long getNum(long k,boolean isEven){
        long t = k;
        //123456
        //122 t = 122

        if(!isEven) {//偶数
            t /= 10;
        }
        while (t != 0) {
            k = k * 10 + t % 10;
            t /= 10;
        }
        return k;
    }
}

 

 
231. 2 的幂(简单)

相关标签

相关企业

给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。

如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。

示例 1:

输入:n = 1
输出:true
解释:20 = 1

示例 2:

输入:n = 16
输出:true
解释:24 = 16

示例 3:

输入:n = 3
输出:false

提示:

  • -231 <= n <= 231 - 1

进阶:你能够不使用循环/递归解决此问题吗?

 

解法一、暴力

试着用2一路乘了,成功超时。(。。。

解法二、换底公式 

一个数字时是以e为底。如果n是2的幂,那么返回应该是个整数

class Solution {
    public boolean isPowerOfTwo(int n) {
        if (n <= 0) return false;
        // 换底公式
        double log_2_n = Math.log(n) / Math.log(2);
        return log_2_n == (int) log_2_n;
    }
}

解法三、和最大比较

2的幂即约数只有2,不妨和2^30取一下模。

class Solution {
    static final int BIG = 1 << 30;

    public boolean isPowerOfTwo(int n) {
        return n > 0 && BIG % n == 0;
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/power-of-two/solutions/796201/2de-mi-by-leetcode-solution-rny3/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

解法四、位运算

两种解法放一起了。n&(n-1),如果是2的幂,则二进制是10···00,假如是1000,n-1则是0111,按位与可以移除。 取负同理

class Solution {
    public boolean isPowerOfTwo(int n) {
        return n > 0 && (n & (n - 1)) == 0;
    }
}
class Solution {
    public boolean isPowerOfTwo(int n) {
        return n > 0 && (n & -n) == n;
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/power-of-two/solutions/796201/2de-mi-by-leetcode-solution-rny3/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

342. 4的幂

给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。

整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x

示例 1:

输入:n = 16
输出:true

示例 2:

输入:n = 5
输出:false

示例 3:

输入:n = 1
输出:true

提示:

  • -231 <= n <= 231 - 1

进阶:你能不使用循环或者递归来完成本题吗?

 

解法一、换底 

class Solution {
    public boolean isPowerOfFour(int n) {
        if(n <=0)return false;
        double t = Math.log(n)/Math.log(4);
        return t == (int)t ? true:false;
    }
}

 

 解法二、位运算+长度确认

比如2是10 4的二进制是100,总之1/4/16转二进制都是奇数长度

class Solution {
    public static boolean isPowerOfFour(int n) {
        String a = Integer.toBinaryString(n);
        return n > 0 && (n & (n - 1)) == 0 && a.length() % 2 == 1 ? true:false;
    }
}

 

 用十六进制的aaaaaa作为标识(这个转换为二进制的形式是1010,偶数位是1,与可以把奇数位消掉)

class Solution {
    public boolean isPowerOfFour(int n) {
        return n > 0 && (n & (n - 1)) == 0 && (n & 0xaaaaaaaa) == 0;
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/power-of-four/solutions/798268/4de-mi-by-leetcode-solution-b3ya/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

取模,4%3 = 1,2%3 = 2。。这个好厉害啊( 

class Solution {
public:
    bool isPowerOfFour(int n) {
        return n > 0 && (n & (n - 1)) == 0 && n % 3 == 1;
    }
};

作者:力扣官方题解
链接:https://leetcode.cn/problems/power-of-four/solutions/798268/4de-mi-by-leetcode-solution-b3ya/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 


碎碎念

  • HashSet看起来还挺好用的,第一次用到,能够用foreach也挺开心,喜欢
  • 虽然是简单,但是没想到位运算的话就会很复杂,空套循环。。是真的需要提高对二进制数字的敏感度了
  • 被马拉车+BF+KMP整自闭了一段时间,昨天休息了一天,今天一打开三简一中两困难(耗时三小时五分),也是又感觉有点命运多舛了 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

钢铁无组织排放的超低改造(朗观视觉)

朗观视觉小编观察发现&#xff1a;随着环保政策的日益严格和公众对环境质量要求的不断提高&#xff0c;钢铁行业作为重工业的代表&#xff0c;面临着巨大的环保压力。无组织排放作为钢铁企业环保治理的难点之一&#xff0c;如何实现超低排放成为行业关注的焦点。本文将从技术路…

MAC安装mysql以及配置环境变量

安装mysql 下载mysql,网址&#xff1a;MySQL :: Download MySQL Community Server 我下载的版本是mysql-9.0.1-macos14-arm64.dmg 打开&#xff0c;双击 一路点击继续安装即可&#xff1b; 最后需要给root设置密码后就安装完成了 但是打开终端输入mysql&#xff0c;依然显…

河南萌新联赛2024第(三)场:河南大学

传送门&#xff1a;河南萌新联赛2024第&#xff08;三&#xff09;场&#xff1a;河南大学_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ B 正则表达式 思路&#xff1a;模拟 代码&#xff1a; #include<bits/stdc.h> using namespace std; typedef long lo…

狗狗换毛期怎么办?家里狗毛遍地,狗毛空气净化器帮你解决

对于养狗家庭来说&#xff0c;换毛季节的到来无疑是一场家中的“毛发风暴”。特别是养如萨摩耶、金毛等大型长毛犬的朋友们&#xff0c;更是深有体会。每日即便精心梳理&#xff0c;家中仍难以避免地被层层狗毛所覆。狗狗时不时晃一下身体&#xff0c;抖动身上的毛发&#xff0…

【list的模拟实现】

list的模拟实现 小杨 list相关类要实现的接口 namespace yang {// List的节点类template<class T>struct ListNode{ListNode(const T& val T());ListNode<T>* _prev;ListNode<T>* _next;T _val;};//List的迭代器类template<class T, class Ref, cla…

土壤分析仪:解锁土壤奥秘,赋能现代农业的绿色引擎

在广袤无垠的大地上&#xff0c;土壤是生命之源&#xff0c;滋养着万物生长。然而&#xff0c;随着现代农业的快速发展和环境的不断变化&#xff0c;土壤的健康状况日益受到关注。如何科学、精准地了解土壤的性质与养分状况&#xff0c;成为现代农业可持续发展的关键。这时&…

ST-LINK未能串口keil识别的一个可能解决方案(前提驱动安装无问题)

打开这个软件&#xff0c;在点击清除之前&#xff0c;按住单片机复位按钮不放&#xff0c;点击清除按钮&#xff0c;等待3-5秒放开复位按钮&#xff0c;即可清除重置&#xff0c;若提示没识别到&#xff0c;多重复几次&#xff0c;即可重置&#xff0c;重置完成之后再回到烧写软…

兴业严选|朝阳优质好房合集 低至6.3折起~

7月25日&#xff0c;存款挂牌利率迎来今年首次下调。中国工商银行、中国农业银行、中国银行、中国建设银行四家大型商业银行从7月25日起&#xff0c;均下调了人民币存款挂牌利率。这是今年以来大型商业银行首次下调人民币存款利率&#xff0c;也是自2022年9月以来的第五次下调。…

不是ChatGPT模型,第一个GAI是ELIZA,你听说过吗?

人工智能&#xff08;Artificial Intelligence, AI&#xff09;的概念可以追溯到20世纪50年代&#xff0c;当时数学家和计算机科学家开始探讨如何让机器模拟人类智能。1956年&#xff0c;达特茅斯会议被认为是人工智能研究的正式起点。然而&#xff0c;生成式人工智能&#xff…

day7 Excel教程——如何用单元格格式给表格化个妆?(超多干货)

day7 如何用单元格格式给表格化个妆&#xff1f; 目录 1. 单元格内容 Excel中单元格内容分为文本、数值、逻辑值。在没有任何格式下&#xff1a; 文本&#xff1a;左对齐&#xff0c;不能计算 数值&#xff1a;右对齐&#xff0c;可以计算 逻辑值&#xff1a;对/错&#xff0…

XR-Frame 计算相机与场景物体的距离

如下哦 const cameraTransform this.scene.getElementById(camera).getComponent(transform)const modelTransform this.scene.getElementById(yourNodeId).getComponent("transform");if (cameraTransform.worldPosition.distanceTo(modelTransform.worldPosition…

Simulink代码生成:基本算数运算

文章目录 1 引言2 模块使用实例2.1 Add模块2.2 Product模块2.3 Gain模块 3 代码生成4 总结 1 引言 算数运算是Simulink中的一种基本运算&#xff0c;对应C语言中的算数运算符&#xff0c;包括加、减、乘、除和取模运算。本文研究这几种运算在Simulink的使用&#xff0c;以及生…

微服务架构革新:百度Jarvis2.0与云原生技术的力量

作者 | 商业广告平台团队 导读 从十几个模块到上千个微服务&#xff0c;百度如何构建业界最复杂的微服务系统&#xff1f;Jarvis平台&#xff0c;十年磨一剑&#xff0c;集服务治理、配置管理、链路追踪于一体&#xff0c;打造云原生控制中心。Jarvis2.0&#xff0c;多运行时架…

大型分布式B2B2C多用户商城7.0企业版源码分享【java语言、方便二次开发】

项目介绍 项目基于SpringBoot开发&#xff0c;运营端和商户端采用ElementVue&#xff0c;买家使用采用VueIviewnuxt服务端渲染。使用到的中间件有Redis、RabbitMQ、ElasticSearch、FastDFS、Mongodb等。主要功能包括有运营管理、商品管理、订单管理、售后管理、会员管理、财务…

【PyQt5】一文向您详细介绍 QRadioButton() 的作用

【PyQt5】一文向您详细介绍 QRadioButton() 的作用 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕&am…

windows下安装gcc和make

目录 引言 第一种&#xff1a;自定义安装 下载和安装MinGw 将bin目录添加进环境变量 拷贝mingw-get.exe改名为make.exe 查看gcc和make命令是否安装成功 测试make和makefile 第二种&#xff1a;免安装&#xff0c;解压可用 下载mingw64 配置环境变量 拷贝mingw-get.e…

链码简介及MATLAB提取彩色图像链码

一、链码 链码&#xff08;又称为freeman code&#xff09;是一种通过带有给定方向的单位长度的线段序列来描述轮廓边界的方法,常被用来在图像处理、计算机图形学、模式识别等领域中表示曲线和区域边界。在二维图像中&#xff0c;链码可以表示为一系列的方向码&#xff0c;每个…

基于遗传算法的BP神经网络+代码解析

嗨&#xff0c;我是射手座的程序媛&#xff0c;期待和大家更多的交流与学习&#xff0c;欢迎添加3512724768。 基于遗传算法的BP神经网络代码解析 自己在2024年年初开始时&#xff0c;因为某些原因&#xff0c;了解到了基于遗传算法的神经网络。之前&#xff0c;对遗传算法并…

韦东山瑞士军刀项目自学之复习OS中断相关知识

和STM32无关&#xff0c;单纯是为了秋招复习一下中断的流程&#xff0c;其中涉及到内核态与用户态之间的转换&#xff0c;以及系统调用等等

开源免费软件一键瘦身你的Windows系统-Win11Debloat

开源免费软件一键瘦身你的Windows系统-Win11Debloat 前言 随着 Windows 11 的发布&#xff0c;许多用户发现系统中预装了大量的应用和功能&#xff0c;这些应用和功能可能会影响系统的性能和用户体验。为了帮助用户优化他们的 Windows 11 系统&#xff0c;可以使用一个名为 W…