整数反转,判断2的次幂,求众数问题

整数反转

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:输入: 123, 输出: 321
示例 2:输入: -123,输出: -321
示例 3:输入: 120, 输出: 21
注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

我们抓取num最低位(%10)赋给reverse,*10后将num缩小十倍(/10)再取余再加给reverse,一直进行到/10等于0为止;这样一直进行直到原本的最高有效位加到reverse变成了最低位。达到了反转整数的目的;

#define IntMax 0x7FFFFFFF
#define IntMin 0x80000000
int min = IntMin;
int max = IntMax;
int reverse(int x) 
{
    int shang = x;
    long int result = 0;
    while(shang)
    {
        result  = result*10+shang%10;
        shang /= 10;
        if(result>max || result<min)
        {return 0;}
    }
    return result;
}
判断2的次幂

给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
示例 1:输入: 1,输出: true解释: 2 0 = 1
示例 2:输入: 16,输出: true解释: 24 = 16
示例 3:输入: 218,输出: false

首先我们来思考是2的幂次方具有什么特征:
1,大于0;
2,这个数的二进制位表达式中一定只有一个位置为1;
根据这些特点:我们想到了一个神奇的表达式:n=n&(n-1),这个表达式的神奇之处在于:每进行一次运算,n的二进制表达式最右边的一个1消失,直到全为0位置,所以当我们使用用这个表达式运算一次后n=0,那么这个数的二进制位必然只有一个1;
所以我们可以很轻松地实现这个功能:

bool isPowerOfTwo(int n) 
{
    if(n>0)
    {
        return !(n&(n-1));
    }
    return false;
}
求众数

给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:输入: [3,2,3],输出: 3
示例 2:输入: [2,2,1,1,1,2,2],输出: 2

从题中我们可以知道众数在数组中必定是超过一半的,所以我们直接从第一个元素开始,我们开始向后count计数,如果相同加一,遇到不同的字符减一,如果count=0;就换下一个字符开始检测,最后肯定可以找到那个众数。
我们来看看具体如何实现:

int majorityElement(int* nums, int numsSize) 
{
    int count = 1;
    int judge = *nums;
    for(int i =1;i<numsSize;i++)
    {
        if(judge==nums[i])
        {
            count++;
        }
        else
        {
            count--;
            if(count==0)
            {
                judge = nums[i];
                count = 1;
            }
        }
    }
    return judge;
}
众数问题是指在一个给定的数组中寻找出现数最多的元素。解决这个问题可以使用分治策略。 分治策略是将一个大问题划分为几个相同或类似的子问题来解决,最后将子问题的解合并起来得到整个问题的解。 对于众数问题,可以使用分治策略来解决。具体步骤如下: 1. 如果数组长度为1,则此元素即为众数,直接返回。 2. 将数组分为两个子数组,分别递归调用众数函数,得到两个子数组的众数。 3. 如果两个子数组的众数相同,则此众数即为整个数组的众数,直接返回。 4. 如果两个子数组的众数不同,则统计整个数组中两个众数的出现数,返回出现数较多的众数。 下面是用Python实现分治策略来众数问题的代码: ```python def majority_element(nums): # 递归终止条件:数组长度为1 if len(nums) == 1: return nums[0] # 分为两个子数组 mid = len(nums) // 2 left_nums = nums[:mid] right_nums = nums[mid:] # 递归解左右子数组的众数 left_majority = majority_element(left_nums) right_majority = majority_element(right_nums) # 统计左右子数组众数的出现数 left_count = sum(1 for num in nums if num == left_majority) right_count = sum(1 for num in nums if num == right_majority) # 返回出现数较多的众数 if left_count > right_count: return left_majority else: return right_majority ``` 这样,就可以使用分治策略来解决众数问题了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值