C语言弯道超车必做好题集锦(编程题二)

前言:

编程想要学的好,刷题少不了,我们不仅要多刷题,还要刷好题!为此我开启了一个弯道超车必做好题锦集的系列,此为第二篇编程题篇,每篇大约5题左右。该系列会不定期更新,敬请期待!


1.自除数

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int isSelfDividing(int num) {
	if (num < 1)
	{
		return 0;
	}
	int tmp = num;
	while (tmp)
	{
		int ret = tmp % 10;
		if (ret == 0 || num % ret != 0)
		{
			return 0;
		}
		tmp = tmp / 10;
	}
	return 1;
}

int* selfDividingNumbers(int left, int right, int* returnSize) {
	int pos = 0, i = 0;
	int* arr = (int*)malloc(sizeof(int) * (right - left + 1));
	for (i = left; i <= right; i++)
	{
		if (isSelfDividing(i))
		{
			arr[pos++] = i;
		}
	}
	*returnSize = pos;
	return arr;
}

 【答案解析】:

自除数的判断,数字的每一位都能被源数字整除,有了这个规则,咱们只需要循环获取一个数字的每一位,然后与 源数字取模判断是否为 0 ,如果中间有任意一次不为 0 ,则表示不是自除数。 接下来,只需要遍历数组中的每个元素,判断是否是自除数即可,如果是则加入到返回数组中。


2.除自身以外数组的乘积

除自身以外数组的乘积https://leetcode.cn/problems/product-of-array-except-self/

 

int* productExceptSelf(int* nums, int numsSize, int* returnSize)
{
	int* arr = (int*)malloc(sizeof(int) *( numsSize));
	int i = 0, t = 1;
	arr[0] = 1;
	for (i = 1; i <= numsSize-1; i++)
	{
		arr[i] = arr[i - 1] * nums[i - 1];
	}
	for (i = numsSize-1; i >=0; i--)
	{
		arr[i] = arr[i] * t;
		t = t * nums[i ];
	}
	*returnSize = numsSize;
	return arr;
}

 解析:

方法:左右乘积列表法


3.不用加减乘除做加法

扫描二维码关注公众号,回复: 16428210 查看本文章
方法一:自增 

主体思路:循环其中一个值,每次自减1,让另外一个值自增

int Add(int num1, int num2) {
    if (num1 > 0)
    {
        while (num1--> 0)
        {
            num2++;
        }

    }
    else if (num1 < 0)
    {
        while (num1++ < 0)
        {
            num2--;
        }
    }
    return num2;
}
 方法2:位运算法

小结: 

int Add(int num1, int num2) {
    int sum = num1 ^ num2, c = (num1 & num2) << 1;
    return sum + c;
}


4.找到所有数组中消失的数字

找到所有数组中消失的数字https://leetcode.cn/problems/find-all-numbers-disappeared-in-an-array/

 

方法: 原地修改法
int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize){
  
   int i,t=0;
   int*p= (int*)malloc(numsSize*sizeof(int));
   for( i=0;i<numsSize;i++)
   {
       if(nums[abs(nums[i])-1]>0)          //原地标记数组元素,记得加abs
                nums[abs(nums[i])-1] *= -1;
   }
   for( i=0;i<numsSize;i++)
   {
       if( nums[i]>0)
            p[t++]=i+1;
   }
   *returnSize=t;
   return p;
}
【答案解析】:
numsSize 大小的数组,其中每个元素的数据在 [1, numsSize] 区间之内,解法其实并不复杂,以数组元素的绝对值 作为下标,将对应位置的数据置为负数,比如 0 号位置是 3 ,则把 3 号位置的数据重置为负值,等到数组遍历重置 完毕,只有缺失的这个数字对应的位置保留正数,其他出现过的数字位置都会是负数, 要注意不要重复设置负数, 因为负负得正。


5.最大连续 1 的个数

最大连续 1 的个数icon-default.png?t=N6B9https://leetcode.cn/problems/max-consecutive-ones/

int Max(int x, int y)
{
	return x > y ? x : y;
}

int findMaxConsecutiveOnes(int* nums, int numsSize) {
	int count = 0, maxcount = 0,i=0;
	for (i = 0; i < numsSize; i++)
	{
		if (nums[i] == 1)
		{
			count++;
		}
		else
		{
			maxcount = Max(maxcount, count);
			count = 0;
		}
	}
	maxcount = Max(maxcount, count);
	return maxcount;
}

 解析:


以上为我个人的小分享,如有问题,欢迎讨论!!! 

都看到这了,不如关注一下,给个免费的赞 

 

猜你喜欢

转载自blog.csdn.net/WHabc2002/article/details/132504176