目录
1.电话号码组合
2. JZ39 数组中出现次数超过一半的数字
3.删除有序数组中的重复项
1.电话号码组合
给定一个仅包含数字
2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:digits = "23" 输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]输入:digits = "" 输出:[]
思路:
利用回溯来实现,也就是深度优先搜索(DFS)算法来探索所有可能的组合。
tmp为字符串,用于存储临时组合,还有一个名为nums
的数组,用于存储数字与字母的映射关系。
数组ret用于存储我们将生成的最终组合。
Dfs
函数是一个递归函数,执行深度优先搜索以生成所有可能的组合。它接受两个参数:当前在数字字符串中的位置pos
和digits
字符串本身。
在Dfs
函数内部,我们检查是否已经到达了digits
字符串的末尾.
如果是,我们将存储在
tmp
中的当前组合添加到ret
向量中,并返回。然后移除
tmp
中的最后一个字符,以进行回溯并尝试下一个字母。否则,我们获取当前位置处数字的数值,并使用for循环遍历与该数字关联的字母。对于每个字母,我们将其添加到
tmp
字符串中,递归调用Dfs
,并继续到下一个位置。
代码实现:
class Solution {
public:
string tmp;
vector<string> nums={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
vector<string> ret;
void Dfs(size_t pos,string digits)
{
if(pos==digits.size())
{
ret.push_back(tmp);
return;
}
int num=digits[pos]-'0';
for(int i=0;i<nums[num].size();i++)
{
tmp.push_back(nums[num][i]);
Dfs(pos+1,digits);
tmp.pop_back();
}
return;
}
vector<string> letterCombinations(string digits) {
vector<string> v;
if(0==digits.size())
return {};
Dfs(0,digits);
return ret;
}
};
2. JZ39 数组中出现次数超过一半的数字
描述
给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
输入描述:
保证数组输入非空,且保证有解
思路:
count和ret
,分别用来记录当前数字的出现次数和出现次数超过一半的数字。
因为ret出现的次数大于其他所有数字出现的次数,所以:
使用一个for循环遍历输入的numbers
向量。在循环中,我们首先检查count
是否为0,如果是,说明当前ret
中记录的数字出现次数已经被抵消完了,因此我们将ret
更新为当前遍历到的数字e
。
然后我们检查当前遍历到的数字e
是否与ret
相等,如果相等,我们将count
递增;如果不相等,我们将count
递减。
最终,我们返回ret
,即为数组中出现次数超过一半的数字。
代码实现:
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int>& numbers) {
// write code here
int count=0;
int ret=0;
for(int e:numbers)
{
if(count==0)
ret=e;
if(ret==e)
count++;
else
count--;
}
return ret;
}
};
3.删除有序数组中的重复项
给你一个 非严格递增排列 的数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
考虑 nums
的唯一元素的数量为 k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。 - 返回
k
。
思路:
while循环来遍历数组。循环条件是it
不等于nums
的倒数第二个位置,因为在循环体中我们会使用++it
。
如果it迭代器指向的数据不等于下一个,--it,因为在比较中++了it;
如果相等,将it
向前移动一位并调用erase
函数来删除当前位置的元素,然后继续下一轮循环。
最终,返回nums
的长度,即为删除重复项后的数组长度。
代码实现:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
vector<int>::iterator it=nums.begin();
while(it!=nums.end()-1)
{
if(*it!=*++it)
{
--it;
}
else
{
--it;
it=nums.erase(it);
continue;
}
it++;
}
return nums.size();
}
};