牛客网-------HJ11 数字颠倒
题目描述:输入一个整数,将这个整数以字符串的形式逆序输出 程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001
解题思路: 1 模10,输出,除10就可以了 2特殊情况:0的时候要特别处理一下
这一题比较简单,看看代码
#include<stdio.h>
int main()
{
int n=0;
scanf("%d",&n);
if(n==0)
printf("%d",0);
while(n)
{
printf("%d",n%10);
n=n/10;
}
return 0;
}
力扣-------27. 移除元素
题目描述:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 说明: 为什么返回数值是整数,但输出的答案是数组呢? 请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
解题思路: 用双指针i,j,同时从下标为0的位置开始, 不等于val的值就赋值 nums[j]=nums[i], 如果等于val就i++。
int removeElement(int* nums, int numsSize, int val)
{
int i=0,j=0,count=0;
while(i<numsSize)
{
while(i<numsSize && nums[i]!=val)
{
nums[j++]=nums[i++];
count++;
}
while(i<numsSize && nums[i]==val)
i++;
}
return count;
}
力扣-----189. 轮转数组
题目描述:给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数 解题思路: 1这个和字符串的左旋和右旋一样。 2这里我推荐用三步旋转法。时间复杂度O(n),空间复杂度O(1). 3右旋k个字符,先把前面n-k个字符逆置,再你只后面的k个字符,最后整体逆置就是目标了
看代码
void reverse(int* arr,int left,int right)
{
assert(arr);
while(left<right)
{
int tmp=arr[left];
arr[left]=arr[right];
arr[right]=tmp;
left++;
right--;
}
}
void rotate(int* nums, int numsSize, int k)
{
k=k%numsSize;
reverse(nums,0,numsSize-k-1);
reverse(nums,numsSize-k,numsSize-1);
reverse(nums,0,numsSize-1);
}
牛客网-------HJ31 单词倒排
题目描述: 对字符串中的所有单词进行倒排。 说明: 1、构成单词的字符只有26个大写或小写英文字母; 2、非构成单词的字符均视为单词间隔符; 3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符; 4、每个单词最长20个字母;
解题思路: 1,从后向前遍历数组 2,记录下是字母的下标pos1,然后继续向前,与到不是字母停下pos2. 3,然后从pos2+1到pos1打印即可,不要忘了打印个空格
看代码
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main()
{
char arr[10000]={0};
scanf("%[^\n]",arr);
int i=strlen(arr)-1;
int j=0;
while(i>=0)
{
while(i>=0 && !isalpha(arr[i]))
i--;
j=i;
while(i>=0 && isalpha(arr[i]))
i--;
int m=0;
for(m=i+1;m<=j;m++)
printf("%c",arr[m]);
printf(" ");
}
return 0;
}
牛客网----HJ56 完全数计算
题目描述: 完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。 它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。 例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。
题目真的很简单,就不写解题过程了 看看代码:
#include<stdio.h>
#include<math.h>
int perfectnumber(int n)
{
int i=0,sum=1;
for(i=2;i<=sqrt(n);i++)
{
if(n%i==0)
{
sum=sum+i;
if(i!=sqrt(n))
{
sum+=n/i;
}
}
}
if(sum==n)
return 1;
else
return 0;
}
int main()
{
int n=0;
scanf("%d",&n);
int i=0,count=0;
for(i=2;i<n;i++)
{
if(perfectnumber(i))
count++;
}
printf("%d\n",count);
return 0;
}
力扣485-----最大连续1的个数
给定一个二进制数组 nums , 计算其中最大连续 1 的个数。
题目简单,就不说了
int findMaxConsecutiveOnes(int* nums, int numsSize)
{
int i=0,j=0,max=0;
while(i<numsSize)
{
int count=0;
while(i<numsSize && nums[i]!=1)
i++;
while(i<numsSize && nums[i]==1)
{
count++;
i++;
}
if(count>max)
max=count;
}
return max;
}
|