11、连续子数组的最大和
HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?
public class Solution {
public int FindGreatestSumOfSubArray(int[]array) {
if(array.length==0) return 0;
int max = array[0];
int sum = 0;
for(int i= 0;i<array.length;i++) {
sum= sum+array[i];
if(max<sum)max = sum;
if(sum<0)sum = 0;
}
return max;
}
}
12、数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。没有找到输出为0。
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
if(array.length==0) return 0;
int temp = array[0];
int time = 1;
for(int i=1;i<array.length;i++) {
if(time==0){
temp= array[i];
}
if(temp==array[i]){
time++;
}else if(temp!=array[i]){
time--;
}
}
if(!CheckMoreThanHalf(array,temp)) return 0;
return temp;
}
public boolean CheckMoreThanHalf(int[]array, int result)
{
int count = 0;
boolean flag =false;
for(int i =0 ; i<array.length; i++)
{
if(array[i]== result)
{
count++;
}
}
if(count*2 > array.length)
flag= true;
return flag;
}
}
13、最小的k个数
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,
import java.util.*;
public class Solution {
public ArrayList<Integer>GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer>list = new ArrayList<Integer>();
ArrayList<Integer>out = new ArrayList<Integer>();
if(k>input.length) return out;
for(int i= 0;i<input.length;++i) {
list.add(input[i]);
}
Collections.sort(list);
for(int i= 0;i<k;i++) {
out.add(list.get(i));
}
return out;
}
}
14、字符串的排列
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
class Solution {
public:
vector<string>Permutation(string str) {
vector<string>res;
if (str.size()==0) return res;
do{
res.push_back(str);
}while(next_permutation(str.begin(),str.end()));
return res;
}
};
15、栈的压入弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。
import java.util.ArrayList;
public class Solution {
public boolean IsPopOrder(ArrayList<Integer>pushA,ArrayList<Integer> popA) {
int index = 0;
while(index<pushA.size()&&index>-1 ){
while(index<pushA.size()&& pushA.get(index)!=popA.get(0)){
index++;
}
if(index>=pushA.size()) return false;
if(index>=0 &&pushA.get(index)==popA.get(0)){
pushA.remove(index);
popA.remove(0);
index--;
}
}
if(popA.size()==0) return true;
return false;
}
}
16、反转列表
输入一个链表,反转链表后,输出反转链表后头节点
/*public class ListNode {
int val;
ListNodenext = null;
ListNode(intval) {
this.val= val;
}
}*/
public class Solution {
public ListNodeReverseList(ListNode head) {
if(head== null) return null;
ListNodecur = head;
ListNodereverseHead = null;
ListNodepNext = null;
ListNodepPre = null;
while(cur!=null){
pNext= cur.next;
if(pNext==null)reverseHead = cur;
cur.next= pPre;
pPre= cur;
cur= pNext;
}
return reverseHead;
}
}
17、合并两个排序的链表
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
/*
public class ListNode {
int val;
ListNodenext = null;
ListNode(intval) {
this.val= val;
}
}
*/
public class Solution {
public ListNodeMerge(ListNode list1,ListNode list2) {
if (list1==null&&list2==null) return null;
if(list1!=null&&list2==null) return list1;
if(list1==null&&list2!=null) return list2;
ListNodelist = null;
if(list1.val<list2.val)
{
list= list1;
list.next= Merge(list1.next,list2);
}
else
{
list= list2;
list.next= Merge(list1,list2.next);
}
return list;
}
}
18、跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法
public class Solution {
public int JumpFloor(int target) {
if(target==1) return 1;
if(target==2) return 2;
int fab1 = 1;
int fab2 = 2;
int temp = 0;
for (int i= 3;i<=target;i++) {
temp= fab1 + fab2;
fab1= fab2;
fab2= temp;
}
return temp;
}
}
19、数值的整数次方
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方
public class Solution {
double Power(double base, int exponent) {
return Math.pow(base,exponent);
}
}