剑指offer:8-11记录

举报
兔老大 发表于 2021/04/30 03:13:11 2021/04/30
【摘要】 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )   示例 1: 输入: ["CQueue","appendTail","deleteHead","deleteHead"] [[...

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

 

示例 1:

输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]
示例 2:

输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
提示:

1 <= values <= 10000
最多会对 appendTail、deleteHead 进行 10000 次调用

 思路:辅助栈,弹出操作之前,当栈2为空时将栈1的元素全部倒入栈2,然后弹出栈2顶。


  
  1. class CQueue {
  2. Stack<Integer> stack1;
  3. Stack<Integer> stack2;
  4. public CQueue() {
  5. stack1 = new Stack<Integer>();
  6. stack2 = new Stack<Integer>();
  7. }
  8. public void appendTail(int value) {
  9. stack1.push(value);
  10. }
  11. public int deleteHead() {
  12. if(stack2.empty()){
  13. while (!stack1.isEmpty()) {
  14. stack2.push(stack1.pop());
  15. }
  16. }
  17. if(stack2.empty()){
  18. return -1;
  19. }
  20. return stack2.pop();
  21. }
  22. }
  23. /**
  24. * Your CQueue object will be instantiated and called as such:
  25. * CQueue obj = new CQueue();
  26. * obj.appendTail(value);
  27. * int param_2 = obj.deleteHead();
  28. */

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:

F(0) = 0,   F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

 

示例 1:

输入:n = 2
输出:1
示例 2:

输入:n = 5
输出:5
 

提示:

0 <= n <= 100

思路:按照式子优化空间,用几个变量即可。


  
  1. class Solution {
  2. public int fib(int n) {
  3. int a = 0, b = 1, sum;
  4. for(int i = 0; i < n; i++){
  5. sum = (a + b) % 1000000007;
  6. a = b;
  7. b = sum;
  8. }
  9. return a;
  10. }
  11. }

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

示例 1:

输入:n = 2
输出:2
示例 2:

输入:n = 7
输出:21
提示:

0 <= n <= 100

式子和上题一样。


  
  1. class Solution {
  2. public int numWays(int n) {
  3. int a = 1, b = 1, sum;
  4. for(int i = 0; i < n; i++){
  5. sum = (a + b) % 1000000007;
  6. a = b;
  7. b = sum;
  8. }
  9. return a;
  10. }
  11. }

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。  

示例 1:

输入:[3,4,5,1,2]
输出:1
示例 2:

输入:[2,2,2,0,1]
输出:0

思路:二分,注意和右端点比,不要左端点。

灵魂是如何操作相等情况。


  
  1. class Solution {
  2. public int minArray(int[] numbers) {
  3. int i = 0, j = numbers.length - 1;
  4. while (i < j) {
  5. int mid = (i + j) / 2;
  6. if (numbers[mid] > numbers[j]) i = mid + 1;
  7. else if (numbers[mid] < numbers[j]) j = mid;
  8. //这一句是细节灵魂所在
  9. else j--;
  10. }
  11. return numbers[i];
  12. }
  13. }


 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/104751223

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。