问题:我正在尝试通过geeksforgeeks解决数组旋转问题。对于较小的数组大小,该代码似乎工作正常,但对于较大的数组大小,它显示一些垃圾值,然后停止工作。
问题在此链接上:https://practice.geeksforgeeks.org/problems/rotate-and-delete/0
我的代码是:
# include<iostream>
using namespace std;
void rotate_clockwise(int *arr, int size)
{
int temp = *(arr + size -1);
for(int i = 0;i < size;++i )
{
*(arr +(size -1) - i) = *(arr + (size-1) -(i+1));//*(arr +(size -1))
}
*arr = temp;
}
void initialize_array(int *arr,int size)
{
for(int i= 0; i < size; ++i)
{
cin>>*(arr +i);
}
}
void print_array(int *arr,int size)
{
for(int i = 0; i< size; i++)
{
cout<<*(arr + i)<<" ";
}
cout<<endl;
}
void remove_ith_fend(int i, int *arr, int *ptr_size)
{
int size = *ptr_size;
int *last = (arr + size -1);
i = i-1;
if(i < size)
{
for(int j =0 ;j<size;j++)
{
*(last - i + j) = *(last -i + j+1);
}
}
else
{
for(int j = 0;j<size;++j)
{
*(arr + j) = *(arr + j +1);
}
}
--size;
*ptr_size = size;
}
int main()
{
int size;
cout<<"Enter size of array: ";
cin>>size;
int *ptr_size;
ptr_size = &size;
int arr[size];
initialize_array(arr, size);
print_array(arr, size);
for(int i =1;size!=1;++i)
{
cout<<"rotating"<<endl;
rotate_clockwise(arr,size);
print_array(arr,size);
remove_ith_fend(i, arr, ptr_size);
cout<<"removing "<<i<<"th element from the end"<<endl;
print_array(arr,size);
}
return 0;
}
我只是尝试这样做,所以我不接受他们在问题中给出的测试用例的输入。 抱歉,我没有评论代码,但我正在解决此问题, 在解决方案正确之后将要做的事。
这是我输入数组大小时遇到的错误:54
Enter size of array: 54
4741824 0 -1 0 4744768 0 4503683 0 1 0 4745728 0 8 0 4751362 0 4744784 0
7339432 0 7339436 0 1 0 0 0 -1 0 4741824 0 -1 0 4741824 0 10 0 4254288
16777216 0 54 8390488 0 224 0 -1 0 4200452 0 0 0 0 0 8 0
rotating
0 4741824 0 -1 0 4744768 0 4503683 0 1 0 4745728 0 8 0 4751362 0 4744784 0
7339432 0 7339436 0 1 0 0 0 -1 0 4741824 0 -1 0 4741824 0 10 0 4254288
16777216 0 54 8390488 0 224 0 -1 0 4200452 0 0 0 0 0 8
removing 1th element from the end
它没有要求任何输入,只是在上面打印了这个东西之后退出了。 另外,请指出我刚接触编程时喜欢编写代码的方式所存在的一些问题,并且希望学习更好的编写方式。
我刚刚使用Visual Studio调试了代码,并显示了此消息
Unhandled exception at 0x0000000000401632 in second.exe: 0xC0000005: Access
violation reading location 0x0000000000000000. occurred
文件名是第二个。
正确的输出也应如下所示:
Enter size of array: 6
1 2 3 4 5 6
1 2 3 4 5 6
rotating
6 1 2 3 4 5
removing 1th element from the end
6 1 2 3 4
rotating
4 6 1 2 3
removing 2th element from the end
4 6 1 3
rotating
3 4 6 1
removing 3th element from the end
3 6 1
rotating
1 3 6
removing 4th element from the end
3 6
rotating
6 3
removing 5th element from the end
3
进行了更多测试,发现它适用于数组大小8和10,但不适用于数组7和9,并且对于大于10的值停止工作。
答案 0 :(得分:2)
这是一个问题
void initialize_array(int *arr,int size)
{
for(int i ; i < size; ++i)
{
cin>>*(arr +i);
}
}
应该是
void initialize_array(int *arr,int size)
{
for(int i = 0; i < size; ++i)
{
cin>>*(arr +i);
}
}
您的编译器应该已经使您意识到未初始化的变量。请注意编译器警告。