补充:vector的OJ题

补充:vector的OJ题

  • T1:去重算法
  • T2、电话号码的字母组合

T1:去重算法

// T1:去重算法
// 给你一个 升序排列 的数组nums, 请你 原地 删除重复出现的元素,使每个元素 只出现一次,返回删除后数组的新长度。
// 元素的 相对顺序 应该保持一致。

class Solution
{
public:
	int removeDuplicates(vector<int>& nums)
	{
		int src = 0, dst = 0;
		while (src<nums.size())
		{
			if (nums[src]==nums[dst])
			{
				++src;
			}
			else
			{
				nums[++dst] = nums[src++];
			}
		}

		nums.resize(dst+1); //把后面重复的项删除
		return dst + 1;
	}
};

T2、电话号码的字母组合

//T2、电话号码的字母组合
// 给定一个仅包含数字 2-9 的字符串,返回所有它能够表示的字母组合。

class Solution
{
	//数字到字母的映射是固定的,所以先写好
	const char* numToStr[10] = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
	//string numToStr[10] = { "","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz" }; //用 常量字符串 去初始化string
	//这儿是成员变量的申明,给的是缺省值【定义是 在初始化列表中进行的】。

public:
	//字母的组合相当于层序遍历,需要进行递归 
	//递归函数
	void Combine(string digits,int di,vector<string>& retV,string combineStr)
		// digits 为传入的 数字字符串, di 为数字字符串的 下标(也是后面层序遍历的层数),
		// retV 用来存放 最终组合得到的所有字符串, combineStr 用来存放 单次组合的字符串
	{
		if (di == digits.size())
		{
			retV.push_back(combineStr);
			return;
		}
			
		//取数字字符映射的字符串
		int num = digits[di] - '0';
		string str = numToStr[num];

		for (auto ch:str)
		{
			Combine(digits,di+1,retV,combineStr+ch);
		}
	}


	vector<string> letterCombinations(string digits)
	{
		vector<string> v;

		if(digits.empty())
			return v;

		string str;
		Combine(digits,0,v,str);

		return v;
	}

};

你可能感兴趣的:(c++)