z26. 删除排序数组中的重复项
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例 1:
给定数组 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1,2
你不需要考虑数组中超出新长度后面的元素。
示例 2:
给定 nums = [0,0,1,1,1,2,2,3,3,4],
函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0,1,2,3,4
你不需要考虑数组中超出新长度后面的元素。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if (nums.size() == 0) return 0;
int num = 0;
for (int i=0; i<nums.size(); i++){
if(nums[i] != nums[num]){
num++;
nums[num]=nums[i];
}
}
return ++num;
}
};
27. 移除元素
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1:
给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。
示例 2:
给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5
, 并且 nums 中的前五个元素为 0,1,3,0,4 注意这五个元素可为任意顺序。 你不需要考虑数组中超出新长度后面的元素。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
int len = removeElement(nums, val);
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int head = 0;
for (int i=0; i<nums.size(); i++){
if (nums[i] != val){
nums[head++] = nums[i];
}
}
return head;
}
};
28. 实现strStr()
实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例 1:
输入: haystack = "hello", needle = "ll"
输出: 2
示例 2:
输入: haystack = "aaaaa", needle = "bba"
输出: -1
说明:
当 needle
是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle
是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。
class Solution {
public:
int strStr(string haystack, string needle) {
int n = haystack.length();
int m = needle.length();
if(m == 0)
return 0;
if(m > n)
return -1;
for(int i = 0; i <= n - m; i++){
string subStr = haystack.substr(i, m);
if(subStr == needle)
return i;
}
return -1;
}
};
29. 两数相除
给定两个整数,被除数 dividend
和除数 divisor
。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend
除以除数 divisor
得到的商。
示例 1:
输入: dividend = 10, divisor = 3
输出: 3
示例 2:
输入: dividend = 7, divisor = -3
输出: -2
说明:
- 被除数和除数均为 32 位有符号整数。
- 除数不为 0。
- 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。
class Solution {
public:
int divide(int dividend, int divisor) {
if (dividend == INT_MIN&&divisor == -1) {
return INT_MAX;
}
return recursion(dividend, divisor);
}
int recursion(int dividend, int divisor) {
int temp;
int i;
int quotient;
int sign;
const int overflow = 1 << 30;
bool flag;
if (-abs(dividend)>-abs(divisor)) {
return 0;
}
sign = (dividend >= 0) ^ (divisor >= 0) ? -1 : 1;
i = 0;
temp = divisor;
flag = (divisor < 0) ^ (bool)(overflow&temp);
while ((!flag)&&(-abs(dividend) < -abs(temp << 1))) {
temp = temp << 1;
i++;
flag = (divisor < 0) ^ (bool)(overflow&temp);
};
if (sign == -1)temp = -temp;
quotient = (sign>0 ? 1 : -1) << i;
return quotient + recursion(dividend - temp, divisor);
}
};
30. 与所有单词相关联的字串
给定一个字符串 s 和一些长度相同的单词 words。在 s 中找出可以恰好串联 words 中所有单词的子串的起始位置。
注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。
示例 1:
输入:
s = "barfoothefoobarman",
words = ["foo","bar"]
输出: [0,9]
解释: 从索引 0 和 9 开始的子串分别是 "barfoor" 和 "foobar" 。
输出的顺序不重要, [9,0] 也是有效答案。
示例 2:
输入:
s = "wordgoodstudentgoodword",
words = ["word","student"]
输出: []
class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words) {
vector<int> res;
if(s.empty() || words.empty()) return res;
int n=words.size(), m=words[0].size();
unordered_map<string,int> m1;
for(auto &a:words) ++m1[a];
for(int i=0; i<=(int)s.size()-n*m; i++){
unordered_map<string,int> m2;
int j=0;
for(; j<n; j++){
string t=s.substr(i+j*m,m);
if(m1.find(t) == m1.end()) break;
++m2[t];
if(m2[t] > m1[t]) break;
}
if(j==n) res.push_back(i);
}
return res;
}
};
(以上题目均摘自leetcode)