|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 乐乐学编程 于 2020-10-21 17:47 编辑
这个题目我不看答案会做,看答案就不会了,请求帮助
【每日一练 第17天】
给定一个数组nums,写一个函数,将数组中所有的0挪到数组的末尾,而维持其他所有非0元素的相对位置。
举例: nums = [0, 1, 0, 3, 12],函数运?后结果为[1, 3, 12, 0, 0]
第17天答案:
思路:创建一个临时数组nonZeroElements,遍历nums,将nums中非0元素赋值到nonZeroElements中,而后按顺序将nonZeroElements赋值到nums上,未遍历的元素置0;
代码如下:
1// 时间复杂度: O(n)
2// 空间复杂度: O(n)
3class Solution {
4public:
5 void moveZeroes(vector<int>& nums) {
6
7 vector<int>
nonZeroElements;
8
9 // 将vec中所有非0元素放入nonZeroElements中
10 for(int i = 0 ; i < nums.size() ; i ++)
11 if(nums[ i ])
12
nonZeroElements.push_back(nums[ i] );
13
14 // 将nonZeroElements中的所有元素依次放入到nums开始的位置
15 for(int i = 0 ; i < nonZeroElements.size() ; i ++)
16 nums[ i ] = nonZeroElements[ i ];
17
18 // 将nums剩余的位置放置为0
19 for(int i = nonZeroElements.size() ; i < nums.size() ; i ++)
20 nums[ i ] = 0;
21 }
22};
#include<stdio.h>
#define n 20
int main()
{
int i,j,nums[n] = {0};
for(i = 0;i < n;i++)
{
scanf("%d",&nums[i]);
}
for (i = 0;i < n;i++)
{
if(nums[i] == 0 && i + 1 < n) // 检测到数组中的0,其后的数据均前移
{
for(j = i;j < n;j++)
{
nums[j] = nums[j + 1];
}
}
}
for(i = 0;i < n;i++)
{
printf("%d ",nums[i]);
}
printf("\n");
}
本程序需要在DEV_C++的菜单--->工具--->编译选项--->编译时加入命令前打勾,并在下面的加入框中加入:-std=c++11
#include <iostream>
#include <iterator>
#include <algorithm>
void foo_c( int a[], size_t n )
{
int* q = a;
for( int *p=a; p!=a+n; ++p )
if( *p != 0 )
*q++ = *p;
for( ; q!=a+n; ++q )
*q = 0;
}
template<typename T,size_t N> void foo_cpp( T (&a)[zxsq-anti-bbcode-N] )
{
std::stable_partition( a, a+N, [](T n){return n>0;} );
}
template<typename T,size_t N> void print( const T (&a)[zxsq-anti-bbcode-N] )
{
std::copy( a, a+N, std::ostream_iterator<T>(std::cout," ") );
std::cout << std::endl;
}
int main( void )
{
{
int nums[] = { 9,0,0,0,10,0,0,0,11,0,12,0,13,0,14,0,15,0,16,0 };
foo_c( nums, sizeof(nums)/sizeof(*nums) );
print( nums );
}
}
|
|