字符串相机&&字符串压缩&&一维数组变二维数组
【摘要】 然后判断是否压缩后的字符串变短了,如果没有,则返回原字符串class Solution {public: string compressString(string S) { string ans ; int count = 1;//count最初置为1,如果有字符,至少有一个字符 for(int i = 0;i<S.size();i++) ...
然后判断是否压缩后的字符串变短了,如果没有,则返回原字符串
class Solution {
public:
string compressString(string S) {
string ans ;
int count = 1;//count最初置为1,如果有字符,至少有一个字符
for(int i = 0;i<S.size();i++)
{
//这里不用保证i+1<S.size()
//因为字符串是可以访问S[S.size()]位置的,这个位置是\0
if(S[i] == S[i+1])
{
count++;
continue;//继续下一轮字符判断
}
//走到这里,说明S[i]和下一个字符S[i+1]不相同了
ans+=S[i];//字符
ans+=to_string(count);//个数
count = 1;//count重新置1
}
//若压缩后的字符串没有变短,则返回原先的字符串
return ans.size()<S.size()?ans:S;
}
};
415. 字符串相加
从字符串的尾部开始往前相加,然后把最后相加的结果逆置
当:其中一个字符串没有遍历结束 || 进位不为0 都需要继续处理
如: “99” + “1” ->相加的结果为:001 ->逆置:100
class Solution {
public:
string addStrings(string num1, string num2) {
int carry = 0;//进位信息, 0/1
int n1 = num1.size()-1;
int n2 = num2.size()-1;
//从后往前相加
//如果有进位信息||其中一个字符串没有结束都继续加
string ans ;
while(carry || n1>=0 || n2>=0)
{
int sum = 0;//每一轮重新置0!!!
if(n1>=0) //如果num1没有遍历结束就+,否则不处理
sum += num1[n1--] - '0';
if(n2>=0)//如果num2没有遍历结束就+,否则不处理
sum += num2[n2--] - '0';
sum += carry;
//处理进位信息
carry = sum>=10 ? 1 : 0;
ans.push_back(sum%10 + '0');
}
reverse(ans.begin(),ans.end());//逆置字符串
return ans;
}
};
2022. 将一维数组转变成二维数组
https://leetcode.cn/problems/convert-1d-array-into-2d-array/
注意:如果一维数组的元素个数不为 m*n,那么就构造不出m*n的二维数组,直接返回空容器
方法1:直接遍历一维数组,双层循环,构造m*n的二维数组,定义一个变量index标志遍历到一维数组的哪个元素
class Solution {
public:
vector<vector<int>> construct2DArray(vector<int>& original, int m, int n) {
//构造成m行n列的二维数组
//如果original数组的元素个数不为:n*m个,就构造不出m行n列的二维数组
vector<vector<int>> vv;
if(original.size() != m*n)
{
return vv;
}
size_t index =0;//标志遍历到original的哪个下标位置
//m行n列
for(int i = 0;i<m;i++)
{
vector<int> tmp;
tmp.resize(n);//记得要为tmp开辟空间!!!
for(int j = 0;j<n;j++)
{
tmp[j] = original[index++];
//tmp.push_back(original[index++]);//不可以使用push_back,因为是在原来已经有空间的情况下,继续往后插入数据!
}
vv.push_back(tmp);
}
return vv;
}
};
方法2:使用迭代器区间构造, 原生指针是迭代器,所以每次使用数组的n个元素作为一段迭代器区间构造
class Solution {
public:
vector<vector<int>> construct2DArray(vector<int>& original, int m, int n) {
//二维数组的每一行可以认为是一个一维数组
vector<vector<int>> vv;
if(original.size() != m*n)
{
return vv;
}
//要构造m行n列的二维数组 -> 每一行有n个元素
//每次从original中获取n个元素的首尾迭代器,构造一个临时vector插入到vv
//然后迭代器往后走n步,来到下一个一维数组的起始位置
for(auto it = original.begin();it != original.end();it+=n)
{
vector<int> tmp{it,it+n};//[it,it+n)共n个元素
vv.push_back(tmp);//将构造好的一维数组插入到二维数组当中
}
return vv;
}
};
方法2优化版本:使用C++11的新成员函数emplace_back
class Solution {
public:
//使用c++11中的vector的成员函数:emplace_back
//该函数功能:emplace_back函数的作用是减少对象拷贝和构造次数,是C++11中的新特性,主要适用于对临时对象的赋值
//在使用push_back函数往容器中增加新元素时,必须要有一个该对象的实例才行,而emplace_back可以不用,它可以直接传入对象的构造函数参数直接进行构造,减少一次拷贝和赋值操作
/*
vector<info> v;
v.push_back(info("nginx"));//在push_back之前,必须使用info实例一个临时对象传入才行,实例对象就必须要执行构造函数,然后拷贝到容器中再执行一次拷贝构造函数
v.emplace_back("redis")//emplace_back可以不用执行多余的拷贝构造函数了,它是直接在容器内执行对象的构造
*/
vector<vector<int>> construct2DArray(vector<int>& original, int m, int n) {
vector<vector<int>> vv;
if(original.size() != m*n)
{
return vv;
}
for(auto it = original.begin();it != original.end();it+=n)
{
//每次从original中获取n个元素的首尾迭代器,利用emplace_back函数插入到vv中
vv.emplace_back(it,it+n);
}
return vv;
}
};
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)