第26题:删除有序数组中的重复项
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入 nums 的前 k 个位置后返回 k 。
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
int removeDuplicates(int* nums, int numsSize){
int i, sum;
if(numsSize == 0) return 0;
if(numsSize == 1) return 1;
sum = 1;
for(i = 1; i <numsSize; i++)
{
if(nums[i] != nums[sum-1])
{
nums[sum] = nums[i];
sum++;
}
}
return sum;
}
第27题:移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-element
int cmp(const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}
int removeElement(int* nums, int numsSize, int val){
int len = 0;
int i, j, k;
i = 0;
qsort(nums, numsSize, sizeof(int), cmp);
for( i = 0; i < numsSize; i++)
{
if(nums[i] == val) break;
}
if(i == numsSize) return numsSize;
for( j = i+1; j < numsSize; j++)
{
if(nums[j] != val) break;
}
if(j == numsSize) return i;
k = j - i;
len = numsSize - k;
for( i = i; i < len ; i++)
{
nums[i] = nums[i + k];
}
return len;
}
第28题:实现strStr()
实现 strStr() 函数。
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/implement-strstr
int strStr(char * haystack, char * needle){
int len1 = strlen(needle);
int len2 = strlen(haystack);
if(len1 == 0) return 0;
if(len1 > len2) return-1;
int i, j;
for(i = 0; i < len2; i++)
{
if(haystack[i] == needle[0])
{
if(i + len1 > len2) return -1;
for(j = 1; j < len1; j++)
{
if(haystack[i+j] != needle[j]) break;
}
if(j == len1) return i;
}
}
return -1;
}