牛客剑指offer(持续更新~)
第一题:二维数组的查找
题目描述
题解:
参考代码:
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
// array是二维数组,这里没做判空操作
int rows = array.size();
int cols = array[].size();
int i=rows-,j=;//左下角元素坐标
while(i>= && j<cols){//使其不超出数组范围
if(target<array[i][j])
i--;//查找的元素较少,往上找
else if(target>array[i][j])
j++;//查找元素较大,往右找
else
return true;//找到
}
return false;
}
};
C++
第二题:替换空格
题目描述
题解:
参考代码:
public class Solution {
public String replaceSpace(StringBuffer str) {
return str.toString().replaceAll("\\s", "%20");
}
}
第三题:从尾到头打印字符
题目描述
题解:
每次插入到vector的头部直到head==NULL;
参考代码:
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head)
{
vector<int> ans;
while(head!=NULL)
{
ans.insert(ans.begin(),head->val);
head=head->next;
}
return ans; }
};
C++
第四题:重建二叉树
题目描述
题解:
参考代码:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
if(pre.size()==||pre.size()!=vin.size()) return NULL; vector<int> pre_left,pre_right;
vector<int> inl,inr;
TreeNode *node=new TreeNode(pre[]);
int rootindex;
//找到中序遍历数组中根的位置
for(int i=;i<vin.size();++i)
{
if(vin[i]==pre[])
{
rootindex=i;
break;
}
}
//左子树元素
for(int i=;i<rootindex;++i)
{
inl.push_back(vin[i]);
if(i+<pre.size()) pre_left.push_back(pre[i+]);
}
//右子树元素
for(int i=rootindex+;i<vin.size();++i)
{
inr.push_back(vin[i]);
pre_right.push_back(pre[i]);
} node->left=reConstructBinaryTree(pre_left,inl);
node->right=reConstructBinaryTree(pre_right,inr); return node;
}
};
C++
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in)
{
TreeNode node=func(pre,0,pre.length-1,in,0,in.length-1);
return node;
}
public TreeNode func(int [] pre,int pre_start,int pre_end,int [] in,int in_start,int in_end)
{
if(pre_start>pre_end||in_start>in_end)
{
return null;
}
TreeNode node = new TreeNode(pre[pre_start]); for(int i=in_start;i<=in_end;++i)
{
if(in[i]==pre[pre_start])
{
node.left=func(pre,pre_start+1,pre_start+i-in_start,in,in_start,i-1);
node.right=func(pre,pre_start+i-in_start+1,pre_end,in,i+1,in_end); break;
}
}
return node;
}
}
Java
第五题:用两个栈来实现一个队列
题目描述
题解:
参考代码:
class Solution
{
public:
void push(int node) {
stack1.push(node);
} int pop() {
int ans;
if(!stack2.empty())
ans=stack2.top(),stack2.pop();
else
{
while(!stack1.empty())
{
stack2.push(stack1.top());
stack1.pop();
}
ans=stack2.top(),stack2.pop();
}
return ans;
} private:
stack<int> stack1;
stack<int> stack2;
};
C++
import java.util.Stack; public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>(); public void push(int node) {
stack1.push(node);
} public int pop() {
if(!stack2.empty())
return stack2.pop();
else
{
while(!stack1.empty())
{
stack2.push(stack1.pop());
}
return stack2.pop();
}
}
}
Java
第六题:旋转数组最小的数字
题目描述
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
题解:
参考代码:
class Solution {
public:
int minNumberInRotateArray(vector<int> array) {
if(!array.size()) return ;
int ans=array[];
for(int i=;i<array.size();++i)
ans=min(ans,array[i]);
return ans;
}
};
C++
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
if(array.length==0) return 0;
int ans=array[0];
for(int i=1;i<array.length;++i)
{
if(array[i]<ans) ans=array[i];
}
return ans; }
}
Java
第七题:斐波那契数列
题目描述
n<=39
题解:
a[n]=a[n-1]+a[n-2];
参考代码:
class Solution {
public:
int Fibonacci(int n) {
int a=,b=;
if(n==) return ;
if(n==||n==) return ;
for(int i=;i<=n;++i)
{
int c=a;
a=a+b;
b=c;
}
return a;
}
};
C++
public class Solution {
public int Fibonacci(int n) {
int a=1,b=1;
if(n==0) return 0;
if(n==1||n==2) return 1;
for(int i=3;i<=n;++i)
{
int c=a;
a=a+b;
b=c;
}
return a;
}
}
Java
第八题:跳台阶
题目描述
题解:
参考代码:
class Solution {
public:
int jumpFloor(int number) {
if(number==) return ;
if(number==) return ;
return jumpFloor(number-)+jumpFloor(number-);
}
};
C++
public class Solution {
public int JumpFloor(int number) {
if(number==1) return 1;
if(number==2) return 2;
return JumpFloor(number-1)+JumpFloor(number-2);
}
}
Java
第九题:变态跳台阶
题目描述
题解:
和斐波那契数列推导一样,这个推一下吧。
用Fib(n)表示青蛙跳上n阶台阶的跳法数,青蛙一次性跳上n阶台阶的跳法数1(n阶跳),设定Fib(0) = 1;
当n = 1 时,只有一种跳法,即1阶跳:Fib(1) = 1;
当n = 2 时,有两种跳的方式,一阶跳和二阶跳:Fib(2) = Fib(1) + Fib(0) = 2;
当n = 3 时,有三种跳的方式,第一次跳出一阶后,后面还有Fib(3-1)中跳法;第一次跳出二阶后,后面还有Fib(3-2)中跳法;第一次跳出三阶后,后面还有Fib(3-3)中跳法
当n = n 时,共有n种跳的方式,第一次跳出一阶后,后面还有Fib(n-1)中跳法;第一次跳出二阶后,后面还有Fib(n-2)中跳法…第一次跳出n阶后,后面还有 Fib(n-n)中跳法.
Fib(n) = Fib(n-1)+Fib(n-2)+Fib(n-3)+……….+Fib(n-n)=Fib(0)+Fib(1)+Fib(2)+…….+Fib(n-1)
又因为Fib(n-1)=Fib(0)+Fib(1)+Fib(2)+…….+Fib(n-2)
两式相减得:Fib(n) = 2*Fib(n-1) n >= 2
参考代码:
class Solution {
public:
int jumpFloorII(int number) {
if(number==) return ;
int ans=;
for(int i=;i<number;++i)
ans=ans*;
return ans;
}
};
C++
public class Solution {
public int JumpFloorII(int number) {
if(number==0) return 0;
int ans=1;
for(int i=1;i<number;++i)
ans=ans*2;
return ans;
}
}
Java
第十题:矩形覆盖
题目描述
题解:
n=1
:只有横放一个矩形一种解决办法n=2
:有横放一个矩形,竖放两个矩形两种解决办法n=3
:n=2
的基础上加1个横向,n=1的基础上加2个竖向n=4
:n=3
的基础上加1个横向,n=2的基础上加2个竖向
...
n=n
:n = f(n-1) + f(n-2)
参考代码:
class Solution {
public:
int rectCover(int n) {
if(n==) return ;
if(n==) return ;
if(n==) return ;
int a=,b=,c;
for(int i=;i<=n;++i)
{
c=a;
a=a+b;
b=c;
}
return a;
}
};
C++
public class Solution {
public int RectCover(int n) {
if(n==) return ;
if(n==) return ;
if(n==) return ;
int a=,b=,c;
for(int i=;i<=n;++i)
{
c=a;
a=a+b;
b=c;
}
return a;
}
}
Java
第十一题:二进制中一的个数
题目描述
题解:
参考代码:
class Solution {
public:
int NumberOf1(int n) {
int ans=;
while(n)
{
n&=(n-);
ans++;
}
return ans;
}
};
C++
public class Solution {
public int NumberOf1(int n) {
int ans=;
while(n!=)
{
n&=(n-);
ans++;
}
return ans;
}
}
Java
第十二题:数值的整数次方
题目描述
题解:
注意正负号,快速幂即可;
参考代码:
class Solution {
public:
double Power(double b, int e) {
if(e==) return ;
if(e==) return b;
double res=;
int tmp=;
if(e<) e=-e,tmp=; while(e!=)
{
if(e&) res=res*b;
b=b*b;
e>>=;
}
if(tmp==) res=1.0/res; return res;
}
};
C++
public class Solution {
public double Power(double b, int ee) {
if(ee==0) return 1;
if(ee==1) return b;
double res=1;
int tmp=0;
if(ee<0)
{
ee=-ee;
tmp=1;
} while(ee!=0)
{
if((ee&1)==1) res=res*b;
b=b*b;
ee>>=1;
}
if(tmp==1) res=1.0/res; return res;
}
}
Java
第十三题:调整该数组中数字的顺序
题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
题解:
我们用 i记录奇数的位置,j表示偶数的左边界,每次遇到一个奇数,就把j~i-1的偶数向后移一位,然后把这个奇数放到第j个位置上,j++;
参考代码:
class Solution {
public:
void reOrderArray(vector<int> &array) {
vector<int> t1,t2;
int i,j;
for(i=;i<array.size();i++){
if(array[i]%!=){
t1.push_back(array[i]);
}else{
t2.push_back(array[i]);
}
}
for(i=;i<t1.size();i++){
array[i]=t1[i];
}
for(j=;j<t2.size()&&i<array.size();j++,i++){
array[i]=t2[j];
}
}
};
C++
public class Solution {
public void reOrderArray(int[] array) {
int j = 0;
for (int i = 0; i < array.length; i++) {
if (array[i] % 2 == 1) {
//如果是奇数的话
if (i != j) {
int temp = array[i];
int k = i;
for (k = i; k > j; k--) {
array[k] = array[k - 1];
}
array[k] = temp; }
j++;
}
}
}
}
Java
第十四题:输出链表中倒数第k个结点
题目描述
输入一个链表,输出该链表中倒数第k个结点。
题解:
参考代码:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
ListNode* p=pListHead;
ListNode* q=pListHead;
int i=;
for(;p!=NULL;i++)
{
if(i>=k)
q=q->next;
p=p->next;
}
if(i<k)
return NULL;
else
return q;
}
};
C++
/*
public class ListNode {
int val;
ListNode next = null; ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode FindKthToTail(ListNode pListHead,int k) {
ListNode p=pListHead;
ListNode q=pListHead;
int i=0;
for(;p!=null;i++)
{
if(i>=k)
q=q.next;
p=p.next;
}
if(i<k)
return null;
else
return q;
}
}
Java
第十五题:反转链表
题目描述
题解:
参考代码:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
ListNode *reverse=NULL;
ListNode *node=pHead;
ListNode *pre=NULL;
while(node!=NULL)
{
ListNode *next=node->next;
if(next==NULL)
reverse=node;
node->next=pre;
pre=node;
node=next;
}
return reverse;
}
};
C++
public class Solution {
public ListNode ReverseList(ListNode head) {
ListNode pre = null;
ListNode now = head;
ListNode aft = null;
while(now != null){
aft = now.next;
now.next=pre;
pre = now;
now = aft;
}
return pre;
}
}
Java
第十六题 反转链表
题目描述
题解:
记录3个指针即可。
参考代码:
public class Solution {
public ListNode ReverseList(ListNode head) {
ListNode pre = null;
ListNode now = head;
ListNode aft = null;
while(now != null){
aft = now.next;
now.next=pre;
pre = now;
now = aft;
}
return pre;
}
}
Java
第十七题 合并两个有序链表
题目描述
public class Solution {
public ListNode Merge(ListNode l1,ListNode l2) {
ListNode l3=new ListNode(0);
ListNode l4=l3;
while(l1!=null && l2!=null)
{
if(l1.val<=l2.val)
{
l3.next=l1;
l1=l1.next;
}
else
{
l3.next=l2;
l2=l2.next;
}
l3=l3.next;
}
if(l1!=null) l3.next=l1;
else if(l2!=null) l3.next=l2;
return l4.next;
}
}
Java
第十八题 树的子结构
题目描述
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null; public TreeNode(int val) {
this.val = val; } }
*/
public class Solution { public boolean IsSubtree(TreeNode a,TreeNode b)
{
if(b==null) return true;
if(a==null) return false;
if(a.val==b.val)
{
return IsSubtree(a.left,b.left) && IsSubtree(a.right,b.right);
}
else return false;
} public boolean HasSubtree(TreeNode root1,TreeNode root2)
{
if(root2==null||root1==null) return false; return IsSubtree(root1,root2)||HasSubtree(root1.left,root2)||HasSubtree(root1.right,root2);
}
}
Java
第十九题 二叉树镜像
题目描述
输入描述:
二叉树的镜像定义:源二叉树
8
/ \
6 10
/ \ / \
5 7 9 11
镜像二叉树
8
/ \
10 6
/ \ / \
11 9 7 5
题解:
水题,递归将左右子树交换即可。
参考代码:
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null; public TreeNode(int val) {
this.val = val; } }
*/
public class Solution {
public void Mirror(TreeNode root)
{
if(root==null) return ;
TreeNode temp=root.left;
root.left=root.right;
root.right=temp;
Mirror(root.left);
Mirror(root.right);
}
}
Java
第二十题 顺时针打印矩阵
题目描述
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix)
{
int row = matrix.size();
if(row==) return {};
int col = matrix[].size();
vector<int> res;
if (row == || col == ) return res; // 定义四个关键变量,表示左上和右下的打印范围
int left = , top = , right = col - , bottom = row - ;
while (left <= right && top <= bottom)
{
// left to right
for (int i = left; i <= right; ++i) res.push_back(matrix[top][i]);
// top to bottom
for (int i = top + ; i <= bottom; ++i) res.push_back(matrix[i][right]);
// right to left
if (top != bottom)
for (int i = right - ; i >= left; --i) res.push_back(matrix[bottom][i]);
// bottom to top
if (left != right)
for (int i = bottom - ; i > top; --i) res.push_back(matrix[i][left]);
left++,top++,right--,bottom--;
}
return res;
}
};
C++
第二十一题 包含min函数的栈
题目描述
class Solution {
public:
stack<int> st,st2; void push(int value)
{
st.push(value);
if(st2.empty() || (value<st2.top()))
st2.push(value);
}
void pop()
{
if(!st.empty())
{
int val=st.top();
st.pop();
if(val==st2.top())
st2.pop();
}
}
int top()
{
if(!st.empty())
return st.top();
}
int min()
{
if(!st2.empty())
return st2.top();
}
};
C++
第二十二题 栈的压入和弹出
题目描述
题解:我们模拟栈的压入,如果当前栈顶元素等于出栈的最前面的元素,则出栈,后移出栈数组的最前面元素,知道不相等,或则入栈数组元素用完。左后判断栈是否为空即可。
参考代码:
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV)
{
stack<int> st;
int id=;
for(int i=;i<popV.size();++i)
{
while(st.empty()||st.top()!=popV[i])
{
st.push(pushV[id++]);
if(id>pushV.size())
return false;
}
st.pop();
}
if(st.empty()) return true;
else return false;
}
};
C++
第二十三题 从上往下打印二叉树
题目描述
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/ class Solution {
public:
vector<int> PrintFromTopToBottom(TreeNode* root)
{
vector<int> ans;
if(root==NULL) return ans;
queue<TreeNode*> q; q.push(root);
int cnt=;
while(!q.empty())
{
TreeNode* u=q.front();q.pop();
ans.push_back(u->val);
if(u->left) q.push(u->left);
if(u->right) q.push(u->right);
}
return ans;
}
};
C++
第二十四题 二叉搜索树的后序遍历序列
题目描述
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
return bst(sequence,,sequence.size()-);
}
bool bst(vector<int> sequence,int begin,int end)
{
if(sequence.empty()||begin>end)
return false;
int root=sequence[end];
int i=begin;
for(;i<end;++i)
if(sequence[i]>root) break;
for(int j=i;j<end;++j)
if(sequence[j]<root) return false;
bool left=true;
if(i>begin)
left=bst(sequence,begin,i-);
bool right=true;
if(i<end-)
right=bst(sequence,i,end-);
return left&&right;
}
};
C++
牛客剑指offer(持续更新~)的更多相关文章
- 链表分割——牛客剑指offer
题目描述: 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 给定一个链表的头指针 ListNode pHead,请返回重新排列后的链表的头指针.注意:分割以后 ...
- 链表中环的入口结点——牛客剑指offer
题目描述: 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 题目分析: 从上图中可以看出,环的入口结点和其他结点的区别:环的入口结点是有两个指针指向的,其他结点除了头结点都 ...
- 删除链表中重复的结点——牛客剑指offer
题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理 ...
- 从尾到头打印列表——牛客剑指offer
题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 解题思路 思路1: 顺序遍历链表,取出每个结点的数据,插入list中. 由于要求list倒序存储链表中的数据,而我们是顺序取 ...
- 二维数组中的查找——牛客剑指offer
题目描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整 ...
- 牛客剑指Offer-数字在升序数组中出现的次数
题目 统计一个数字在升序数组中出现的次数. 示例1 输入 [1,2,3,3,3,3,4,5],3 返回值 4 题解 第一种最简单的方法是O(n)复杂度.遍历数组统计结果. public int Get ...
- 牛客网剑指offer刷题总结
二维数组中的查找: 题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 两 ...
- LeetCode题解汇总(包括剑指Offer和程序员面试金典,持续更新)
LeetCode题解汇总(持续更新,并将逐步迁移到本博客列表中) LeetCode题解分类汇总(包括剑指Offer和程序员面试金典) 剑指Offer 序号 题目 难度 03 数组中重复的数字 简单 0 ...
- LeetCode题解分类汇总(包括剑指Offer和程序员面试金典,持续更新)
LeetCode题解汇总(持续更新,并将逐步迁移到本博客列表中) 剑指Offer 数据结构 链表 序号 题目 难度 06 从尾到头打印链表 简单 18 删除链表的节点 简单 22 链表中倒数第k个节点 ...
随机推荐
- one of neural network
map source:https://github.com/microsoft/ai-edu Fundamental Principle inputs: characteristic value th ...
- ThreadLocal<T> 源码解析
在activeJDBC框架内部的实现中看到了 ThreadLocal 这个类,记录下了每个线程独有的连接 private static final ThreadLocal<HashMap< ...
- Typescript I: 遍历Array的方法:for, forEach, every等
Typescript的官方文档 Iterators and Geneators (https://www.typescriptlang.org/docs/handbook/iterators-and- ...
- linux 修改IP地址(设置为静态ip)和主机名
主机名: server0.example.com ip地址: 172.25.0.11 网络掩码: 255.255.255.0 默认网关: 172.25.0.254 域名服务器:172.25.254.2 ...
- opencv 3 core组件进阶(3 离散傅里叶变换;输入输出XML和YAML文件)
离散傅里叶变换 #include "opencv2/core/core.hpp" #include "opencv2/imgproc/imgproc.hpp" ...
- Previous operation has not finished; run 'cleanup' if it was interrupted最简单有效的解决方法
今天提交代码报错,看了看提示的错误,百度了一下,发现操作都比较繁琐,所以自己重新给一个最简单有效的. 有的要下载sqlite3.exe,借助它清空本地.svn\wc.db数据库文件里面的operati ...
- React动画库
npm i react-transition --save import {CSSTransition} from 'react-transition-group'
- 看了这篇Redis,我以大专生的身份,进入了阿里,定级P7
摘要: 前几天讲了Redis的面试知识点,当然那只是一部分,我相信各位在面试,或者实际开发过程中对缓存雪崩,穿透,击穿也不陌生吧,就算没遇到过但是你肯定听过,那三者到底有什么区别,我们又应该怎么去防止 ...
- 16 Zabbix4.4.1系统告警“Zabbix agent is not available (for 3m)“
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 Zabbix4.4.1系统告警“Zabbix agent is not available (fo ...
- nmap中的详细命令
nmap全部参数详解-A 综合性扫描端口:80http 443https 53dns 25smtp 22ssh 23telnet20.21ftp 110pop3 119nntp 143imap 179 ...