版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tfcy694/article/details/88544348
二维数组中查找
要点:终止条件——跑出边界
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
int r=0, c=array[0].size()-1;
while(r<array.size()&&(c>=0)){
if(array[r][c]==target)return true;
else if(array[r][c]>target)c--;
else r++;
}
return false;
}
};
替换空格
要点:统计字符数量和空格数量。
class Solution {
public:
void replaceSpace(char *str,int length) {
if(str == NULL && length <= 0)return;
/*originalLength 为字符串str的实际长度*/
int originalLength = 0, numberOfBlank = 0;
int i = 0;
while(str[i] != '\0')
{
++ originalLength;
if(str[i] == ' ') ++ numberOfBlank;
++ i;
}
/*newLength 为把空格替换成'%20'之后的长度*/
int newLength = originalLength + numberOfBlank * 2;
if(newLength > length)return;
int indexOfOriginal = originalLength;
int indexOfNew = newLength;
while(indexOfOriginal >= 0 && indexOfNew > indexOfOriginal)
{
if(str[indexOfOriginal] == ' ')
{
str[indexOfNew --] = '0';
str[indexOfNew --] = '2';
str[indexOfNew --] = '%';
}
else str[indexOfNew --] = str[indexOfOriginal];
-- indexOfOriginal;
}
}
};
从尾到头打印链表
要点:栈
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> v;
if(head==NULL)return v;
stack<int> s;
ListNode *t = head;
while(t!=NULL){
s.push(t->val);
t=t->next;
}
while(!s.empty()){
v.push_back(s.top());
s.pop();
}
return v;
}
};
用栈实现队列
要点:一个栈专门负责push,另一个专门负责pop
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
int n;
if(stack2.empty()){
while(!stack1.empty()){
stack2.push(stack1.top());
stack1.pop();
}
}
n=stack2.top();
stack2.pop();
return n;
}
private:
stack<int> stack1;
stack<int> stack2;
};
dp入门
要点:跳台阶和拼矩形等价,二者和斐波那契数列略有区别。变态跳台阶同理,将dp表画出来即可找到规律,注意求和之后要加1.
class Solution {
public:
int Fibonacci(int n) {
if(n==0)return 0;
if(n==1)return 1;
vector<int> v;
v.push_back(0);
v.push_back(1);
for(int i=2;i<=n;i++){
v.push_back(v[i-1]+v[i-2]);
}
return v[n];
}
};
class Solution {
public:
int jumpFloor(int number) {
if(number==0)return 0;
if(number==1)return 1;
vector<int> v;
v.push_back(0);
v.push_back(1);
v.push_back(2);
for(int i=3;i<=number;i++)v.push_back(v[i-1]+v[i-2]);
return v[number];
}
};
class Solution {
public:
int rectCover(int number) {
if(number==0)return 0;
if(number==1)return 1;
vector<int> v;
v.push_back(0);
v.push_back(1);
v.push_back(2);
for(int i=3;i<=number;i++)v.push_back(v[i-1]+v[i-2]);
return v[number];
}
};
class Solution {
public:
int jumpFloorII(int number) {
vector<int> v;
v.push_back(0);
v.push_back(1);
for(int i=0; i<number; i++){
int sum = 0;
for(int i=0; i<v.size(); i++)sum+=v[i];
v.push_back(sum+1);
}
return v[number];
}
};
二进制中1的个数
要点:负数取膜得到的还是负数
class Solution {
public:
int NumberOf1(int n) {
int r=0;
for(int i=0;i<32;i++){
int tmp=n%2;
r+=((tmp==0)?0:1);
n=n>>1;
}
return r;
}
};