【C语言】LeetCode: 724. 寻找数组的中心下标;169. 多数元素。牛客: HJ10 字符个数统计

1. 724. 寻找数组的中心下标

724. 寻找数组的中心下标

前缀和求法
int pivotIndex(int* nums, int numsSize) {
    int total = 0;//求所有元素总和
    for (int i = 0; i < numsSize; i++)
    {
        total += nums[i];
    }
    int sum = 0;//求前缀和
    for (int i = 0; i < numsSize; i++)
    {
        if (total - nums[i] == 2 * sum)
        {
            return i;
        }
        sum += nums[i];
    }
    return -1;
}

2. 169. 多数元素

169. 多数元素

2.1 排序法

如果将数组 nums 中的所有元素按照单调递增或单调递减的顺序排序,那么下标为 n-1/2 的元素(下标从 0 开始)一定是众数。

int cmp(int* a, int* b)
{
    return *a - *b;
}

int majorityElement(int* nums, int numsSize){
    qsort(nums, numsSize, sizeof(nums[0]), cmp);
    return nums[(numsSize - 1) / 2];
}
2.2 分类哈希
int majorityElement(int* nums, int numsSize){
	int hash[50000],hasher[50000],i;
	memset(hash,0,sizeof(hash));
	memset(hasher,0,sizeof(hasher));
	for(i=0;i<numsSize;i++)
	{
		if(nums[i]>-1)
		{
			++hash[nums[i]];
			if (hash[nums[i]]>numsSize/2)
				return nums[i];
		}
		else
		{
			++hasher[-nums[i]];
			if (hash[-nums[i]]>numsSize/2)
				return -nums[i];
		}
	}
	return 0;
}
2.3 摩尔投票法

摩尔投票法两个步骤

1. 投票阶段:投票人之间票数进行抵消
2. 计数阶段:计算对抗结果最后剩下的那个候选人的票数是否有效


int majorityElement(int* nums, int numsSize)
{
	int len=numsSize;
        
        int major=nums[0];//遍历第一个元素,候选人是2
        int count=0;
       
        for(int i=0;i<len;i++){
             
             //如果数组中还有2的话我们的count就++;
             if(nums[i]==major){
                 count++;
             }else{
                 //如果没有就减1
                 count--;
             }
             //如果count=0的时候就更换候选人
             if(count==0){
                //更换候选人
                major=nums[i];//重新赋值major
                //票数重置为1
                count=1;
 
             }
        }
        return major;
}

3. HJ10 字符个数统计

HJ10 字符个数统计

类哈希思想
#include <stdio.h>
#include <string.h>
int main() {
    char c=0;
    int a=0;
    char hash[128]={0};
    int ret=0;
    while(scanf("%c",&c) != EOF)
    {
        a=(int)c;
        if(hash[a] == 0 && a!= 10)
        {
            ret++;
        }
        hash[a]=1;
    }
    printf("%d\n",ret);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值