牛客网做题总结:剑指offer中题目,java版二

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);

  }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值