leecode7 整数反转

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

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

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

int reverse(int x){
    int s=0;
    while(x!=0)
    {
        if(s<INT_MIN/10||s>INT_MAX/10)
            return 0;
        s=s*10+x%10;
        x/=10;
    }
        return s;
}

这里的if(s<INT_MIN/10||s>INT_MAX/10) 之所以要有除10的操作,是为了保证 s=s10+x%10; 这句话不出错误,假设一次循环后s临近 int 所能表示的临界范围,若此时循环结束则没有什么影响,但若没有结束,在进行下一次循环时,假设if语句没有除10那部分内容,那么此时的s是不满足if的条件的,因为虽然它快到边界值,但毕竟还没到,接着再执行下一行语句 s=s10+x%10,因为有乘以10这个内容所以肯定是超过int的边界值,的这就导致程序会报错,无法返回正确的内容,

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

int reverse(int x){
    long long int s=0;
    while(x!=0)
    {
        s=s*10+x%10;
        x/=10;
    }
        if(s<INT_MIN||s>INT_MAX)
        //if(s<(-1*pow(2,31))||s>(pow(2,31)-1))这样写也可以
            return 0;
        else
            return s;
}

说明(摘抄网址:http://c.biancheng.net/ref/limits_h/)
INT_MAX与INT_MIN是C语言库#include<limits.h>库中定义的宏,分别代表int类型所能表示的最大值与最小值

C语言的一个优良传统是标量类型(整数是典型的标量类型)要以一种对每个计算机
体系结构都很自然的方式表示。例如,基本整型 int 的弹性就很大,它希望自己
的大小等于一个机器字长:

在 16 位环境中,机器字长为 16 位,int 占用 2 个字节;
在 32 位环境中,机器字长为 32 位,int 占用 4 个字节;
在 64 位环境中,机器字长为 64 位,int 依然占用 4 个字节。

由此可知在64 位环境中int类型占用的并不是一个机器字长,依旧是4个字节,这是
因为计算机发展到64位时c语言已经存在了很多年,此时已经有大量基于 32 位环境
编写的代码,这些代码中Int类型占据的就是4个字节,若是64为环境中int类型变为
8个字节,那么这些代码便不一定能继续运行,因此,64 位环境下的 int 依然占用
4 个字节的内存。
 
 这对于程序的效率而言是个好事,但从可移植性来说是个麻烦,因此,C语言标准委
 员会发明了 <limits.h> 头文件来捕捉标量类型在不同计算机体系结构之间的变化。

<limits.h> 头文件没有定义任何函数或者类型,仅定义了一些与整数类型有关的宏。如果想获取与浮点数有关的特性,应该查看<float.h> 头文件;如果查看指定长度的整数类型,应该查看 <stdin.h> 头文件。

在这里插入图片描述

### LeetCode Java 面试题 以下是基于提供的引用内容以及专业知识整理的一些常见的 LeetCode Java 面试题: #### 一:链表反转 实现单链表的反转是一个经典的算法题目。可以通过迭代或者递归来完成此操作[^3]。 ```java public ListNode reverseList(ListNode head) { ListNode prev = null; ListNode curr = head; while (curr != null) { ListNode nextTemp = curr.next; curr.next = prev; prev = curr; curr = nextTemp; } return prev; } ``` #### 二:计 N 以内的素数 统计小于非负整数 `n` 的质数数量可以使用埃拉托斯特尼筛法来高效解决。 ```java public int countPrimes(int n) { boolean[] isPrime = new boolean[n]; Arrays.fill(isPrime, true); for (int i = 2; i * i < n; i++) { if (!isPrime[i]) continue; for (int j = i * i; j < n; j += i) { isPrime[j] = false; } } int count = 0; for (int i = 2; i < n; i++) { if (isPrime[i]) count++; } return count; } ``` #### 三:删除排序数组中的重复项 给定一个升序排列的数组,移除其中的重复元素并返回新长度。 ```java public int removeDuplicates(int[] nums) { if (nums.length == 0) return 0; int uniqueIndex = 0; for (int i = 1; i < nums.length; i++) { if (nums[i] != nums[uniqueIndex]) { uniqueIndex++; nums[uniqueIndex] = nums[i]; } } return uniqueIndex + 1; } ``` #### 四:寻找数组的中心下标 找到数组的一个索引位置使得其左侧和右侧的总和相等。 ```java public int pivotIndex(int[] nums) { int totalSum = 0; for (int num : nums) totalSum += num; int leftSum = 0; for (int i = 0; i < nums.length; ++i) { if (leftSum == (totalSum - leftSum - nums[i])) return i; leftSum += nums[i]; } return -1; } ``` #### 五:x 的平方根 计算某个正数的平方根而不使用库函数。 ```java public int mySqrt(int x) { long start = 0, end = x; while(start <= end){ long mid = start + (end - start)/2; if(mid*mid == x) return (int)mid; else if(mid*mid > x) end = mid-1; else start = mid+1; } return (int)end; } ``` #### 六:数组中三个数的最大乘积 找出数组中任意三个数能够组成的最大乘积。 ```java public int maximumProduct(int[] nums) { Arrays.sort(nums); int option1 = nums[nums.length - 1] * nums[nums.length - 2] * nums[nums.length - 3]; int option2 = nums[0] * nums[1] * nums[nums.length - 1]; return Math.max(option1, option2); } ``` #### 七:两数之和 在一个数组中查找两个加起来等于目标值的数,并返回它们的索引。 ```java public int[] twoSum(int[] numbers, int target) { Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < numbers.length; i++) { int complement = target - numbers[i]; if (map.containsKey(complement)) { return new int[]{map.get(complement), i}; } map.put(numbers[i], i); } throw new IllegalArgumentException("No two sum solution"); } ``` #### 八:斐波那契数列 通过动态规划方法优化时间复杂度为 O(n)。 ```java public int fib(int N) { if(N<=1) return N; int a=0,b=1,c=0; for(int i=2;i<=N;i++){ c=a+b; a=b; b=c; } return b; } ``` #### 九:乐观锁与悲观锁的理解及其实现方式 乐观锁通常依赖数据库版本号机制或时间戳控制并发访问冲突;而悲观锁则利用数据库事务隔离级别(如 SELECT FOR UPDATE)锁定记录防止修改[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值