学会分析问题,找出规律;
不要小看任何一个小程序,小程序都是实现大的功能的基础--体现问题分解的思想)
思想火花--好算法是反复努力和重新修正的结果
解法1:先将数组中的前i个元素存放在一个临时数组中,再将余下的n一i个元素左移i个位置,最后将前i个元素从临时数组复制回原数组中后面的i个位置。但是这个算法使用了i个额外的存储单元,其空间复杂度是 O(i)。
// 一个数组向左移动i位.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<stdio.h>
int main1(int argc, char* argv[])//王红梅老师63页解法1
{
int a[7]={1,2,3,4,5,6,7};
int n=7;int i=3;
int b[7];
for(int k=0;k<i;k++)
{
b[k]=a[k];
}
/* for(k=0;k<i;k++)
{
printf("%d\n",b[k]);
}*/
for(int m=i;m<7;m++)
{
a[m-i]=a[m];
}
/* for(int test=0;test<n-i;test++)
{
printf("%d\n",a[test]);
}*/
for(int t=n-i,j=0;t<7&&j<i;j++,t++)
a[t]=b[j];
for(k=0;k<7;k++)
{
printf("%d\n",a[k]);
}
printf("Hello World!\n");
return 0;
}
在代码注释的部分是为了test中间结果是否正确::::::写一个小功能就测试以下(这是一个好习惯,要坚持)
int main()
{
int a[7]={1,2,3,4,5,6,7};
int n=7;int i=3;
for(int k=0;k<i;k++)
{
int temp=a[0];
for(int j=1;j<7;j++)
{
a[j-1]=a[j];
}
a[n-1]=temp;
}
for(k=0;k<7;k++)
{
printf("%d\n",a[k]);
}
return 0;
}
思想火花--好算法是反复努力和重新修正的结果
考虑一个问题:将一个具有"个元素的数组向左循环移动i个位置。有许多应用程序会调用这个问题的算法,例如在文本编辑器中移动行的操作,磁盘整理时交换两个不同大小的相邻内存块等。所以,这个问题的算法要求有较高的时间和空间性能。
解法1:先将数组中的前i个元素存放在一个临时数组中,再将余下的n一i个元素左移i个位置,最后将前i个元素从临时数组复制回原数组中后面的i个位置。但是这个算法使用了i个额外的存储单元,其空间复杂度是 O(i)。
解法2:先设计一个函数将数组向左循环移动1个位置,然后再调用该算法i次,显
void fanzhan01(int a[],int n)
{
int temp=0;
for(int i=0;i<=(n-1)/2;i++)//i<(n-1)/2边界问题,举例偶数个和奇数个两种不同情况下会怎样???
{
temp=a[i];a[i]=a[n-i-1];a[n-i-1]=temp;// a[n-i-1]我写成a[n-i]写错了
}
/* for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}*//test
printf("\n");
}
void fanzhan02(int a[],int j,int n)
{
int temp=0;
for(int i=j,end=n-1;i<=j;i++,end--)//i<(n-1)/2边界问题,举例偶数个和奇数个两种不同情况下会怎样???
{
temp=a[i];a[i]=a[end];a[end]=temp;// a[n-i-1]我写成a[n-i]写错了
}
/* for(i=j;i<n;i++)
{
printf("%d ",a[i]);
}*/
printf("\n");
}
int main()
{
int a[7]={1,2,3,4,5,6,7};
int n=7;int i=3;
fanzhan01(a,i);
fanzhan02(a,3,7);
fanzhan01(a,n);
for(int k=0;k<7;k++)
{
printf("%d\n",a[k]);
}///test
return 0;
}
fanzhan02函数更易实现,但是对一个辅助变量,一定多test中间结果,别到最后发现问题错误,才知道修改到时很难找出错误