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=100001∗100100∗101000
同时要考虑各种边界情况,例如当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.