注:注释的代码是自己写的
1.题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
public boolean Find(int target, int [][] array) {
/*int len=array.length-1;
if(target<array[0][0]||target>array[len][len]){
return false;
}
else{
for(int i=0;i<=len;i++){
if(array[i][len]>=target){
for(int j=0;j<=len;j++){
if(array[i][j]==target){
//System.out.println(j+" "+i);
return true;
}
}
}
}
}
return false;*/
if (null == array) {
return false;
}
int i = 0;//表示第一行
int j = array[0].length;//表示该二维数组的列数
int start;
while (i < array.length && j > 0) {
start = array[i][j-1];//每次清除一行或一列后的最右上角的元素
if (target < start) {
j--;
} else if (target > start) {
i++;
} else {
return true;
}
}
return false;
}
2题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
public String replaceSpace(StringBuffer str) {
/*String temp=str.toString();
if(temp.compareTo(" ")==0) {
System.out.println("%20%20%20");
}
String log="";
String[] mail=temp.split(" ");
for(int i=0;i<mail.length;i++) {
log=log+mail[i];
if(i!=mail.length-1) {
log=log+"%20";
}
}
if(temp.endsWith(" ")) {
log=log+"%20";
}
return log;*/
String str1=str.toString();
String str2=str1.replace(" ","%20");
return str2;
}
3题目描述
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。(递归实现)
import java.util.ArrayList;
public class Solution {
ArrayList<Integer> list = new ArrayList<Integer>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode!=null){
printListFromTailToHead(listNode.next);
list.add(listNode.val);
}
return list;
}
}
4题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
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()) {
int a = stack2.peek();
stack2.pop();
return a;
}
else {
while(!stack1.empty()) {
int k = stack1.peek();
stack2.push(k);
stack1.pop();
}
int a = stack2.peek();
stack2.pop();
return a;
}
}
}
5题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
解题思路:可以看到有序数组旋转后的数组前半部分一定大于后半部分,即当array[i]>array[i+1]可找出最小数
public int minNumberInRotateArray(int [] array) {
if(array.length==0)
return 0;
for(int i=0;i<array.length-1;i++) {
if(array[i]>array[i+1]) {
return array[i+1];
}
}
return 1;
}
网上看到的思路,使用二分法来解题
public static int minNumberInRotateArray(int[] array) {
if (array.length == 0)
return 0;
int left = 0;
int right = array.length - 1;
int middle = -1;
while (array[left]>=array[right]) {
if(right-left==1){//当right等于右数组的最小值时,left等于左数组的最大值时,求出middle
middle = right;
break;
}
middle = left + (right - left) // 找出数组的中间位置值
if (array[middle] >= array[left]) {
left = middle;
}
if (array[middle] <= array[right]) {
right = middle;
}
}
return array[middle];
}
6题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
F(n) = F(n-1)+F(n-2)+...+F(1)
F(n-1) = F(n-2)+F(n-3)+...+F(1)
两个式子相减,很容易得出F(n)=2F(n-1)
注:从后往前看更简单
public int JumpFloorII(int target) {
if(target==1)
return 1;
return JumpFloorII(target-1)*2;
}