刷题第五天

1. 用两个栈来实现队列

题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
解题思路:其实思路很简单,就是一个栈存储,另一个栈用来出队时候反向输出,正好就符合先进先出的规律,所以具体实现是,入栈就是存到栈1,出栈就是当栈2为空时,栈1把结果全都输入到栈2中,栈2在pop一个

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()){
            while(!stack1.empty())
            {
                stack2.push(stack1.pop());
            }
        }
        return stack2.pop();
    }
}

2. 位运算

题目描述:数出一个整数二进制形式中1的个数,负数用补码表示

public class Solution{
	public int numberOf1(int n){
		int count=0;
		while(n>0){
			count += (n&1);
			n = n>>>1;
		}
		return count;
	}
}

3. 数值的整数次方

题目描述:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0。
解题思路:用的是快速幂的思想,具体思想是 10 13 = 10 1101 = 10 0001 + 0100 + 1000 = 10 0001 ∗ 10 0100 ∗ 10 1000 {10}^{13}={10}^{1101}={10}^{0001+0100+1000}={10}^{0001}*{10}^{0100}*{10}^{1000} 1013=101101=100001+0100+1000=100001100100101000
同时要考虑各种边界情况,例如当exponent<0什么的,这就是快速幂思想,base一直增幂,但是只有位数是1的时候,才往结果上乘,exponent<0时返回1/r, exponent>0返回r

public class Solution {
    public double Power(double base, int exponent) {
        double result=1.0;
        int absEx=abs(exponent);
        while(absEx>0){
            if((absEx&1)!=0) result *= base;
            base *= base;
            absEx = absEx>>>1;
        }
        return exponent >0 ? result  :1/result;
  }
    public int abs(int a){
        return a > 0 ? a : (-a);
    }
}

4. 调整数组顺序使奇数位于偶数前面

题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
解题思路:时间复杂度最低的方式应该是,遍历一遍数组,一个arraylist存储奇数,一个arraylist存储偶数,然后在重新存到原来的array里面

import java.util.ArrayList;
public class Solution {
    public void reOrderArray(int [] array) {
        ArrayList<Integer> odd=new ArrayList<Integer>();
        ArrayList<Integer> even=new ArrayList<Integer>();
        for(int i=0;i<array.length;i++)
        {
            if((array[i]&1)>0)
                odd.add(array[i]);
            else
                even.add(array[i]);
        }
        int i=0;
                while(i<odd.size())
        {
            array[i]=odd.get(i);
            i++;
        }
        int j=0;
        while(j<even.size())
        {
            array[i]=even.get(j);
            i++;
            j++;
        }
    }
}

5. 链表中倒数第k个结点

题目描述:输入一个链表,输出该链表中倒数第k个结点。
解题思路:这题不难好多都可以做,然后难得是一次遍历就做完,所以思路是定两个指针,然后一个是指向i, 一个是指向i-k的位置,也就是倒数第k位,然后一定要注意排除, i<k的情况

public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        ListNode p=head,q=head;
        int i=1;
        while(p!=null){
            if(i>k) q=q.next;
            p=p.next;
            i++;
        }
        return i>k ? q:null;
}
}

6. 从上往下打印二叉树

题目描述:层序打印二叉树
就是利用队列,出一个左右孩子进

import java.util.Queue;
import java.util.LinkedList;
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
        Queue<TreeNode> queue=new LinkedList<TreeNode>();
        ArrayList<Integer> number=new ArrayList<Integer>();
        queue.add(root);
        TreeNode pointer=null;
        while(queue.size()!=0&&root!=null)
        {
            pointer=queue.poll();
            number.add(pointer.val);
            if(pointer.left!=null)
                queue.offer(pointer.left);
            if(pointer.right!=null)
                queue.offer(pointer.right);
        }
        return number;
    }
}

7. 顺时针打印矩阵

题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值