자바 일기 2018-06-06

4037 단어
  • 서열화 두 갈래 나무의 서열화란 나무의 값을 앞순서나 뒷순서에 따라 문자열로 바꾸는 것을 말한다.반서열화는 문자열이 하나의 트리 구조로 변하는 것이다
  • //37.  
        public static String Serialize(TreeNode root){
            if(root==null) return "#";
            return root.val+" "+Serialize(root.left) + " " + Serialize(root.right);
        }
        
        
        /**
         *  
         */
        private int index;
        public TreeNode Deserialize(String str) {
            if(str == null || str.trim().length() == 0)
                return null;
            String[] nums = str.split(",");
            index = 0;
            return Deserialize(nums);
        }
    
        public TreeNode Deserialize(String[] nums) {
            if(nums[index].equals("$")) {
                ++index;
                return null;
            }
            TreeNode node = new TreeNode(Integer.valueOf(nums[index++]));
            node.left = Deserialize(nums);
            node.right = Deserialize(nums);
            return node;
        }
    
  • 문자열의 배열 방법은 구체적으로 실현될 때 문제가 발생했다는 것을 기억하고 세부 사항은 다시 배워야 한다
  • // 38.  
        public static void Permutation(StringBuffer stb) {
            if (stb == null)
                return;
            // for(int i=0;i end)
                return;
            if (start == end) {
                System.out.println(stb);
            } else {
                for (int i = start; i <= end; i++) {
                    // ( for i )
                    swap(stb, start, i);
                     // ,
                    PermuCore(stb, start + 1, end);
                     // 
                    swap(stb, start, i);
                }
            }
    
        }
    
        public static void swap(StringBuffer stb, int i, int j) {
            char temp = stb.charAt(i);
            stb.setCharAt(i, stb.charAt(j));
            stb.setCharAt(j, temp);
    
        }
    
  • 수조에서 나타나는 횟수가 절반을 넘는 숫자 수조 중 한 숫자가 나타나는 횟수가 수조의 길이의 절반을 넘는다. 즉, 그것이 나타나는 횟수가 다른 모든 숫자보다 더 많다는 것이다.따라서 우리는 그룹을 두루 돌아다닐 때 두 개의 값을 저장할 수 있다. 하나는 그룹의 한 숫자이고, 하나는 횟수이다.우리가 다음 숫자를 두루 훑어볼 때, 만약 다음 숫자가 우리가 이전에 저장한 숫자와 같다면, 횟수는 1을 더한다.만약 다음 숫자가 우리가 이전에 저장한 숫자와 다르다면, 횟수는 1을 줄인다.만약 횟수가 0이라면, 우리는 다음 숫자를 저장하고, 횟수를 1로 설정해야 한다.우리가 찾는 숫자의 출현 횟수가 다른 모든 숫자의 출현 횟수의 합보다 많기 때문에, 찾는 숫자는 틀림없이 마지막에 횟수를 1로 설정할 때 대응하는 숫자일 것이다
  • public class moreThanHalfNum {
        public static int find(int[] arr) {
            if(arr.length<1) return -1;
            int res=arr[0];
            int count=1;
            for(int i=1;i arr.length / 2 ? res : 0;
            
        }
    
  • 가장 작은 K 개수는 Partition 함수를 바탕으로 이 문제를 해결할 수 있다.만약에 수조의 k번째 숫자를 바탕으로 조정한다면 k번째 숫자보다 작은 모든 숫자는 수조의 왼쪽에 있고 k번째 숫자보다 큰 모든 숫자는 수조의 오른쪽에 있다.이렇게 조정한 후에 수조의 왼쪽에 있는 k개의 숫자가 가장 작은 k개의 숫자이다.파티션은 빠른 정렬 사상에서 비롯된다.빠른 정렬을 관찰하는 것은 모든 수조를 정렬하는 것이다. 현재 값은 전 k개가 필요하면 된다. 따라서 index와 k에 대한 판단은 전 k개만 있으면 된다

  • 구체적으로 실현하려면 주석 안에 쓴 구덩이를 관찰해야 한다
    //40.   K  
        public static int littk(int[] arr,int k) {
            if(arr==null) return -1;
            int index=0;
            index = partion(arr,0,arr.length-1);
            int start = 0;
            int end = arr.length - 1;
            while(index!=k-1) {
                if(index>k-1){
                    //end start , 
                    end = index-1;
                    index=partion(arr,start,end);
                }else{
                    start = index+1;
                    index=partion(arr,start,end);
                }
            }
            return index;
        }
        public static int partion(int[] arr,int start,int end){
            int res = arr[start];
            while(start=res) {
                    end--;
                }
                arr[start] = arr[end];
                while(startright) return;
            
            int i= partion2(arr,left,right);
            sort_fast(arr,left,i-1);
            sort_fast(arr,i+1,right);
            
        }
    

    좋은 웹페이지 즐겨찾기