50+100+针对训练。
感谢大佬几款优秀的支持C、C++在线编译器
此外,教程网站:九章算法课-免费试听可以闲的时候过渡一下,换换思路听着。
另,十大排序算法需要整理一下,参考:1.0 十大经典排序算法
stage2——4天进阶阶段
在线编译器:compile c++ gcc online
刷题网站:阶段1第一关:基本数据类型
day2 planA
lintcode 余3-4
教程完成度60%。
1.翻转字符串
复盘一下。对string
的应用掌握不充分,需要整理string
用法。
2.数组剔除元素后的乘积
思路在其中。
简单归纳一下:
1)学会用迭代器,vector<int>::iterator it;
,迭代器赋初值一定要用it=obj.begin()
,不能用it=&obj[i];
,因为数据类型不一致
2)结合obj.erase(it);
,即删除it
迭代器指向的元素,此时it
指针是不会改变的,只是obj
中的元素被剔除掉1个,即元素前移,it
指向的是删除掉的元素的后一个元素
3)插入指令obj.insert(it,1);
在it
的位置处插入元素1
4)注意数据类型,比如这里的输出类型和累乘整型变量都应该是long long
class Solution {
public:
/**
* @param nums: Given an integers array A
* @return: A long long array B and B[i]= A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1]
*/
vector<long long> productExcludeItself(vector<int> &nums) {
// write your code here
//初步思路,先剔除第i个,然后累乘,然后插入
vector<int>::iterator it;//保存剔除元素
it=nums.begin();//只能用这种取vector的地址函数去赋值,不然类型不对
vector<long long> p;
long long m;//累乘
int tmp;//临时存放
if(nums.size()==1) p.push_back(1);
else
{
for(int i=0;i<nums.size();i++)
{
m=1;
//cout << *it << endl;
tmp=*it;
nums.erase(it);//先剔除
for(int j=0;j<nums.size();j++)//注意这里提出之后num.size()也发生变化但遍历累乘不需要-1
{
m*=nums[j];
}
p.push_back(m);
nums.insert(it,tmp);//再插入,erase剔除之后,it指针不变,但其中元素指向下一个元素了
it++;
}
}
return p;
}
};
3.主元素
简单思路整理:先判断是不是一个元素,是直接返回;不是就先排序,然后累积某一元素数目,一旦大于阈值就返回,否则判断到第i个元素不是该元素,不是就重新累积。
class Solution {
public:
/**
* @param nums: a list of integers
* @return: find a majority number
*/
int majorityNumber(vector<int> &nums) {
// write your code here
//思路:先排序,然后统计每种类型数据数目,一旦找到就返回
if(nums.size()==1) return nums[0];
int j=nums.size()/2;//判断变量
sort(nums.begin(),nums.end());
int tmp;//存储元素
int n=0;//存储元素数目
int i=0;//遍历索引
while(n<=j)
{
tmp=nums[i];
n=count(nums.begin(),nums.end(),tmp);
while(nums[++i]==tmp){}
}
return tmp;
}
};
4.Fizz Buzz问题
要点在于数字和字符串之间的转换:
字符串转数字stoi()
,eg. int i; string str; x=stoi(str);
,头文件string
,数据类型不限;
数字转字符串to_string()
,eg. str=to_string(x);
,但是尽量不要用浮点数,因为会保留小数6位;
字符串数字互转<sstream>的stringstream
,eg. int x; string str; stringstream ss; x >> ss; ss >> str;
,或者str >> ss; ss >> x;
,数据类型不限。
class Solution {
public:
/**
* @param n: An integer
* @return: A list of strings.
*/
vector<string> fizzBuzz(int n) {
// write your code here
vector<string> s;
for(int i=1;i<=n;i++)
{
if(i%3==0 && i%5==0) s.push_back("fizz buzz");
else if(i%3!=0 && i%5!=0) s.push_back(to_string(i));
else if(i%3!=0) s.push_back("buzz");
else s.push_back("fizz");
}
return s;
}
};
5.转换字符串到整数(容易版)
和上面一样。
class Solution {
public:
/**
* @param target: A string
* @return: An integer
*/
int stringToInteger(string &target) {
// write your code here
return stoi(target);
}
};
6.大小写转换2
仍旧考察字符判断函数。
class Solution {
public:
/**
* @param letters: A string
* @return: A string
*/
string lowercaseToUppercase2(string &letters) {
// write your code here
//遍历字符串元素判断
string lu;
for(int i=0;i<letters.size();i++)
{
if( islower(letters[i]) ) lu.push_back(letters[i]-32);
else lu.push_back(letters[i]);
}
return lu;
}
};
7.字符串查找
主要考察string
的find
查找函数。参见[学习笔记-C++篇]day9 STL教程整理。
class Solution {
public:
/**
* @param source:
* @param target:
* @return: return the index
*/
int strStr(string &source, string &target) {
// Write your code here
int pt;
pt=source.find(target);
if(pt==-1) return -1;
else return pt;
}
};
8.转换成小写字母
和前面第6题考查的内容一样。
class Solution {
public:
/**
* @param str: the input string
* @return: The lower case string
*/
string toLowerCase(string &str) {
// Write your code here
string t;
for(int i=0;i<str.size();i++)
{
if(isupper(str[i])) t.push_back(str[i]+32);
else t.push_back(str[i]);
}
return t;
}
};
9.两字符串和
考查字符和数字转换:
不能用字符串和数字转换的方法。
字符转数字:char c; int i=c-'0';
,注意,减去的是字符'0'
,不是数字。
数字转字符:int i; char c=i+'0';
,注意,加上的还是字符'0'
,不是数字。
class Solution {
public:
/**
* @param A: a string
* @param B: a string
* @return: return the sum of two strings
*/
string SumofTwoStrings(string &A, string &B) {
// write your code here
#if 1 //第1种
int size=A.size()>B.size()?A.size():B.size();
int sum;//每一位和
string S;//保存结果
int a=stoi(A),b=stoi(B);
for(int i=0;i<size;i++)
{
sum=a%10+b%10;
S=to_string(sum)+S;
a/=10;
b/=10;
}
return S;
#endif
}
};
这种方法会遇到超出范围的情况,主要是stoi
函数用法问题。
当字符串中有除了数字外的字符时,只会将这些字符前的数字转换为int
。
此外还有atoi
函数,stoi
的参数是const string*
,atoi
的参数是const char*
。
但stoi
有检测范围的。
剩下的明天整理。