算法练习

34 阅读1分钟

1.移除指定元素,返回新数组的长度

    public static int removeElement(int[] nums,int target){
        int index=0;
        for (int i = 0; i <nums.length ; ++i) {
            if(nums[i]!=target){
                nums[index++]=nums[i];
            }
        }
        return index;
    }

2.将数组中的零移动到数组末尾

public static int[] moveZeroes(int[] nums){
        int index=0;
        for (int i = 0; i <nums.length ; ++i) {
            if(nums[i]!=0){
                nums[index++]=nums[i];
            }
        }
        for (int i = index; i <nums.length ; ++i) {
            nums[i]=0;
        }
        return nums;
    }

3.从第二个元素开始排列

    public static void nextPermutation(int[] nums){
        nextPermutation(nums,0,nums.length);
    }
    private static boolean nextPermutation(int[] nums,int begin,int end){
        int p = end-2;
        while (p>-1 && nums[p]>=nums[p+1]) --p;
        if(p==-1){
            reverse(nums,begin,end);
            return false;
        }
        int c=end-1;
        while (c>0 && nums[c]<=nums[p]) --c;
        swap(nums,p,c);
        reverse(nums,p+1,end);
        return true;
    }
    private static void reverse(int[] nums, int begin, int end) {
        end--;
        while (begin<end){
            swap(nums,begin++,end--);
        }
    }
    private static void swap(int[] nums, int i, int j) {
        int tmp=nums[i];
        nums[i]=nums[j];
        nums[j]=tmp;
    }

4.全排列

    public static void permute(int[] nums,int l,int r){
        if(l==r){
            System.out.println(Arrays.toString(nums));
        }else{
            for(int i=l;i<r;i++){
                swap(nums,l,i);
                permute(nums,l+1,r);
                swap(nums,l,i);
            }
        }
    }
    private static void swap(int[] nums, int i, int j) {
        int tmp=nums[i];
        nums[i]=nums[j];
        nums[j]=tmp;
    }

5.数独

    public boolean isValidSudoku(char[][] board){
        boolean[] used = new boolean[9];
        for (int i = 0; i <9 ; i++) {
            Arrays.fill(used,false);
            for (int j = 0; j <9; j++) {
                if(!check(board[i][j],used))
                    return false;
            }
            Arrays.fill(used,false);
            for (int j = 0; j <9 ; j++) {
                if(!check(board[j][i],used))
                    return false;
            }
        }
        for (int i = 0; i <3 ; i++) {
            for (int j = 0; j <3 ; j++) {
                Arrays.fill(used,false);
                for (int k = i*3; k <i*3+3 ; k++) {
                    for (int l = j*3; l <j*3+3 ; l++) {
                        if(!check(board[k][l],used))
                            return false;
                    }
                }
            }
        }
        return true;
    }
    private boolean check(char c, boolean[] used) {
        if(c=='.') return true;
        if(used[c-'1']) return false;
        return used[c-'1'] = true;
    }