我正在参加「掘金·启航计划」
删除排序数组中的重复项
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入 nums 的前 k 个位置后返回 k
int *rear = nums[nums.size()-1];
int *h = null;
int *r = null;
int n = 0;
//利用一个指针一步一步向前测试
while(h != rear)
{
r = h;
r++;
//测试是否与前一个数组内容相同
while(*r == *h)
{
int *p =r;
#相同后,做删除操作
while(p != rear+1)
{
*p = *(p+1);
p++;
}
}
h++;
n++;
}
return n;
int removeDuplicates(vector<int>& nums) {
//双指针解决
//边界条件判断
if (nums.size() == 0)
return 0;
int left = 0;
for (int right = 1; right < nums.size(); right++)
//如果左指针和右指针指向的值一样,说明有重复的,
//这个时候,左指针不动,右指针继续往右移。如果他俩
//指向的值不一样就把右指针指向的值往前挪
if (nums[left] != nums[right])
nums[++left] = nums[right];
return ++left;
}
该方法用一个数组,同时完成判断重复和删除重复的操作。
判断重复是通过一个标记不断向后判断,遇到不同数组内容记录到nums[left]。
旋转数组
给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
class Solution {
public:
void rotate(vector<int>& nums, int k) {
if(nums.size()==1)
{
printf("%d",nums[0]);
}
else if(k==0)
{
for(int n=0;n<nums.size();n++)
{
printf("%d",nums[n]);
}
}
else
{
int t = 0;
for(int i=1; i<=k; i++)
{
for(int j = nums.size()-1; j>=0;j--)
{
if(j == 0)
{
nums[0] = t;
}
else if(j == nums.size()-1)
{
t = nums[nums.size()-1];
nums[j] = nums[j-1];
}
else
{
nums[j] = nums[j-1];
}
}
}
for(int n=0;n<nums.size();n++)
{
printf("%d",nums[n]);
}
}
}
};
思路:分解为两步:1.确定向后移几位。2.在每移一位,执行旋转操作