目录
1008 数组元素循环右移问题

解题:方法一和方法二 (就是轮转数组的问题)
有一个小细节:假设共 5 个数,轮转13 次,这里前十次轮转后数据并不会有变化,
只有最后三次真正在轮转,所以轮转 13 次,和轮转 3 次效果一样。
因此,轮转前处理一下数据,(取余)设共sum个数,轮转 N 次,N = N % sum;
方法一:轮转一次,然后轮转N次
轮转一次就是将首数据挪到最后,剩余数据向前移。
图解(假设要轮转三次)

#include<stdio.h>
void Rotate(int *arr,int sum) //轮转一次
{
int tem = *(arr); //这里要注意先将首元素存储,防止后来被覆盖
*(arr) = *(arr+sum-1);
int i = 0;
for(i = sum-1;i>1;i--)
{
arr[i] = arr[i-1];
}
*(arr+i) = tem;
}
int main()
{
int number = 0;
int sum = 0;
scanf("%d%d",&sum,&number);
number = number%sum; //处理数据
int arr[101] = {0};
for(int i = 0;i<sum;i++)
{
scanf("%d",arr+i);
}
for(int i = 0;i<number;i++)
{
Rotate(arr,sum); //轮转 N 次
}
for(int i = 0;i<sum;i++)
{
printf("%d",*(arr+i));
if(i!=sum-1) //避免打印最后空格
printf(" ");
}
return 0;
}
方法二:三次逆序(很妙)
先 将 要 轮 转 的 数 据 逆 序,再 将 剩 余 数 据 逆 序,再 将 整 句 逆 序 。
图解(假设要轮转三次)

#include<stdio.h>
void NIXU(int *arr,int left,int right) //一个正常的逆序函数
{
for(;left<right;left++,right--)
{
int tem = arr[left];
arr[left] = arr[right];
arr[right] = tem;
}
}
int main()
{
int arr[100] = { 0 };
int sum = 0;
int number = 0;
scanf("%d%d", &sum, &number);
number = number%sum; //处理下数据
for (int i = 0; i < sum; i++) //(防止多次无效循环)
{
scanf("%d", arr + i);
}
NIXU(arr, 0, sum - number - 1); //剩余数据逆序
NIXU(arr, sum - number, sum - 1); //二次:轮转数据逆序
NIXU(arr, 0, sum - 1); //整体逆序
for (int i = 0; i < sum; i++)
{
printf("%d", arr[i]);
if (i != sum-1) //防止最后打印空格
printf(" ");
}
return 0;
}
1009.说反话

方法一:先逐个单词逆序,再整句逆序

( 注:遍历到空格时尽量不要对空格进行操作,防止遍历完,句子头部出现空格。 )
#include<stdio.h>
void reverse(char* arr, int left, int right) //逆序函数
{
for (; left < right; left++, right--)
{
char tem = arr[left];
arr[left] = arr[right];
arr[right] = tem;
}
}
int main()
{
char arr[81];
scanf("%[^\n]", arr); //scanf 的这种写法,
int right = 0; //可以将空格也读取到字符串中
int left = 0;
for (; arr[right] != '\0'; right++)
{
//遇到空格将前的单词进行逆序,遇到'\0'进行最后一次逆序
if (arr[right + 1] == ' ' || arr[right + 1] == '\0')
{
reverse(arr, left, right);
left = right + 2; //每次逆序完,要跳过空格
}
}
reverse(arr, 0, right - 1);
printf("%s", arr);
return 0;
}
1010. 一元多项式求导

(解释) 输入:3 的 4次方 || -5 的 2 次方 || 6 的 1 次方 || -2 的 0 次方
(一下) 输出: 12 ^ 4 -10 ^ 1 6 ^ 0
思路:这里观察发现规律 ,传入 a b 输出 a*b b-1
实现细节:
细节一:(这里哈,在做的时候就发现老是过不去,之后找了答案,发现这道题他有一些限制)
限制1:如果,a*b == 0,并且a和b第一组时,需要打印 0 0
限制2:如果,a*b == 0,但是a和b不是第一组时,就不需要打印
(我又测试了一下,只有第一组打印0 0 )
(但是为什么有这个限制,我也不太清楚,请大佬们指教)
测试用例 :
运行结果 : 
细节二:题目要求输出最后数据尾部没有空格
因为,我是每组分别输出;所以,第一组的输出尾部没有空格,后面的每组在头部添加空格
代码如下:
#include<stdio.h>
int main()
{
int a = 0;
int x = 0;
for (int i = 0; scanf("%d%d", &a, &x) != EOF;)
{
if (0 == i) //判断是否是第一组
{
if(a*x == 0) //判断是否为 0
printf("0 0");
else
printf("%d %d", a * x, x - 1);
}
else if(a*x != 0) //如果不是第一组,就不打印 0 0
{
printf(" %d %d", a * x, x - 1);
}
i++;
}
return 0;
}
最后,感谢各位大佬看到这里!!!(如有不对或应更好的地方请指正哦)
栓 Q!!!

535

被折叠的 条评论
为什么被折叠?



