剑指offer (java)

27.输入一个字符串,按字典序打印出该字符串中字符的所有排列。

例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

//使用全排列+容器排序的方法
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;
public class Solution {
    public ArrayList Permutation(String str) {
       List list = new ArrayList<>();
        char[] ch = str.toCharArray();
        if(str!=null&&str.length()!=0){
            PermutationHelper(ch,0,list);
            Collections.sort(list);
        }
        return (ArrayList)list;
    }
//全排列:递归+回溯法
    public void PermutationHelper(char[] ch,int i,List list){
        if(i==ch.length-1){
            String var = String.valueOf(ch);
            if(!list.contains(var)){
                list.add(var);
            } 
            return;
        }else{
            for(int j=i;j

28.数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。

思路一:数组排序后,如果符合条件的数存在,则一定是数组中间那个数。(比如:1,2,2,2,3;或2,2,2,3,4;或2,3,4,4,4等等)
这种方法虽然容易理解,但由于涉及到快排sort,其时间复杂度为O(NlogN)并非最优;

思路二:如果有符合条件的数字,则它出现的次数比其他所有数字出现的次数和还要多。
在遍历数组时保存两个值:一是数组中一个数字,一是次数。遍历下一个数字时,若它与之前保存的数字相同,则次数加1,否则次数减1;若次数为0,则保存下一个数字,并将次数置为1。遍历结束后,所保存的数字即为所求。然后再判断它是否符合条件即可。
参考代码如下:

public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        if(array==null||array.length==0){
            return 0;
        }
        int count1 = 0;
        int val = 0;
        for(int i=0;i0){
            int count2 = 0;
            for(int i=0;i

29.输入n个整数,找出其中最小的K个数。

例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

import java.util.*;
public class Solution {
    public ArrayList GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList list = new ArrayList();
        if(k>input.length){
            return list;
        }
     
        for(int i=0;ii;j--){
                if(input[j]

你可能感兴趣的:(剑指offer (java))