LintCode 알고리즘 입문:

15670 단어 알고리즘lintcode
1. A + B 의 질문
묘사 하 다.
두 개의 정 수 를 제시 하 다. aa 화해시키다 bb , 그들의 화 해 를 구하 다.
입력 흐름 에서 데 이 터 를 읽 을 필요 가 없습니다. aplusb 의 두 매개 변수 a 와 b 에 따라 그들의 합 을 계산 하고 돌아 오 면 됩 니 다.
설명 하 다.
a 와 b 는 모두  32  정수 요?
  • 비트 연산 자 를 사용 할 수 있 습 니까?
  • 그럼요
  • 본보기
    하면, 만약, 만약...  a=1  그리고  b=2, 귀환 3.
    생각:
    우선 비트 연산 으로 조작 할 생각 을 해 야 한다. 즉, 이 진 으로 처리 해 야 한다. 좋아, 여기까지 생각 한 이상 당연히 예 를 들 어 생각해 야 한다. 가장 간단 한 1 + 2.
    1 의 이 진 · · · 0001
    2 의 이 진 · · · 0010
    3 의 이 진 · · · 0011
    그럼 a + b 는 a | b 와 같 지 않 습 니까?그럼 1 + 3 을 다시 한 번 검증 해 보 겠 습 니 다.
    1 의 이 진 · · · 0001
    3 의 이 진 · · · 0011
    4 의 이 진 · · · 0100
    이전의 추측 이 틀 렸 다 는 것 을 발견 한 후에 다른 간단 한 검산 을 거 쳐 우 리 는 하나의 규칙 을 쉽게 발견 할 것 이다. 만약 에 진 위 를 하지 않 으 면 a + b = a | b 가 진 위 를 하면 성립 되 지 않 는 다.
    그래서 다음 에 진 위 를 처리 해 야 합 니 다. 우 리 는 1 + 3 으로 진 위 를 연구 하고 있 습 니 다. 만약 에 우리 가 진 위 를 무시 한 후에 진 위 를 해 야 할 위 치 를 더 하면 우리 의 값 입 니 다.
                                 1 의 바 이 너 리 (a) · · · 0001
                                 3 의 2 진법 (b) · · · 0011
                     진 위 를 무시 하 는 바 이 너 리 (c) · · · 0010 (진 위 를 무시 하 는 위치) 입 니 다. 진 위 를 무시 한 이상 다음 에 진 위 를 추가 해 야 합 니 다.
                            들 어가 야 할 값 (d) · · · 0010
    우리 의 값 은 c + d 여야 합 니 다.
                                      c 의 이 진 · · · 0010
                                      d 의 이 진 · · · 0010
                     진 을 무시 하 는 바 이 너 리 (e) · · · 0000     
                              들 어가 야 할 값 (f) · · · 0100
    결 과 는 e + f = 4
    해결 방법:
    step 1: a 와 b 를 먼저 계산 합 니 다 (진 위 를 무시 합 니 다) (비트 연산 자 a ^ b 에 해당 합 니 다) a ^ b: 바 이 너 리 의 이 또는 연산
    step 2: 들 어가 야 할 값 (진 위 를 계산) (비트 연산 a & b < < 1) a & b <
    step 3: 위의 step 1 의 값 과 step 2 의 값 을 더 합 니 다.만약 에 자리 가 있 으 면 step 1, step 2 를 계속 실행 하고 쌍방 이 0 이 될 때 까지 다른 쪽 을 출력 하 는 것 이 추가 적 인 결과 입 니 다.
    정 답 1: 
    public class Solution {
        /**
         * @param a: An integer
         * @param b: An integer
         * @return: The sum of a and b 
         */
        public int aplusb(int a, int b) {
            // write your code here
            if (a==0)return b;
            if(b==0)return a;
            int c=a^b;//      ,    
            int d=(a&b)<<1;//        ,   
            return aplusb(c,d);
            // c+d       ,  aplus   ,        ,       //   
        }
    }

     
    정 답 2:
    public static int add( int number_1, int number_2 )
    	{
    		int sum = 0;
    		int carry = 0;
    		do
    		{
    			sum = number_1 ^ number_2;
    			carry = ( number_1 & number_2 ) << 1;
     
     
    			number_1 = sum;
    			number_2 = carry;
    		}
    		while ( carry != 0 );
     
     
    		return sum;
    	}
    

     
     
    2. 알고리즘 을 설계 하여 n 단계 곱 하기 중 꼬리 0 의 개 수 를 계산한다.
    묘사 하 다.
    n 단계 곱 하기 중 꼬리 0 의 개 수 를 계산 하 는 알고리즘 을 설계 하 다.
    당신 은 실제 면접 에서 이 문 제 를 만난 적 이 있 습 니까?  예.
    본보기
    11! = 39916800
    도전 하 다.
    O (logN) 의 시간 복잡 도
    분석 하 다.
    1、2、3、4、5、6、7、8、9、10、11、...101
    1 - 101 리 에 5 개의 숫자 가 있 고 한 개의 숫자 가 있 는 계층 의 꼬리 부분 에 0 이 생 긴 다. 각각 5, 10, 15, 20, 25, 100 은 모두 101 / 5 = 20 개 이다.
    또: 5, 10, 15, 20, 25,... 100
    5 * (1, 2, 3, 4, 5, 6,... 20) 로 바 뀌 면 5 개의 숫자 가 연속 되 어 있 습 니 다.
    그래서 5 * 5 * (1, 2, 3, 4) 로 바 꿀 수 있 습 니 다.
    101. 그래서 최종 적 으로 가지 고 있 는 0 개 수 는...
    101/5=20
    20/5=4 
    하나 24 개
    디자인 사고: n 개의 데 이 터 를 5 로 나 누고 정리 하지 않 으 면 순환 에 넣 어 0 이 있 는 개 수 를 누적 합 니 다.
    public class Solution {
        /*
         * @param n: An integer
         * @return: An integer, denote the number of trailing zeros in n!
         */
        public long trailingZeros(long n) {
            // write your code here, try to do it without arithmetic operators.
            long temp=n/5;
            long count=0;
            while(temp!=0){//    ,      
                count+=temp;//     
                temp/=5;//   temp  ,   
            }
                return count;
        }
    }

    3. 주 원소
    하나의 정형 배열 을 지정 하고 주 요 소 를 찾 습 니 다. 배열 에서 의 출현 횟수 는 배열 요소 개수 의 2 분 의 1 보다 엄 격 히 큽 니 다.
    본보기
    배열 [1, 1, 1, 1, 2, 2, 2] 을 드 리 고 1 로 돌아 갑 니 다.
    도전 하 다.
    요구 시간 복잡 도 는 O (n) 이 고 공간 복잡 도 는 O (1) 이다.
    분석:
    배열 에서 의 출현 횟수 를 이용 하여 배열 요소 개수 의 2 분 의 1 보다 엄 격 히 제어 한다.
    초기 값 과 계수 기 를 정의 합 니 다. 배열 의 다음 원본 은 초기 값 과 같 지 않 습 니 다. 계수 기 는 1 을 줄 입 니 다. 
    초기 값 카운터 에 1 을 추가 하 는 것 과 같 으 면 카운터 가 1 이 고 출력 할 때의 값 은 주 요소 입 니 다.
    public class Solution {
        /*
         * @param nums: a list of integers
         * @return: find a  majority number
         */
        public int majorityNumber(List nums) {
            //        N/2   
            int n=1;//       
            int temp=nums.get(0);//          
            for(int i=1;i

     
    4. 3 자리 정수 반전
    세 자리 수 밖 에 없 는 정 수 를 반전 하 다.
    본보기123  반전 다음 에는...  321900  반전 다음 에는...  9
    주의 사항
    너 는 입력 이 반드시 세 자릿수 만 있 는 정수 라 고 가정 할 수 있다. 이 정 수 는 100 보다 크 고 1000 보다 작다.
    public class Solution {
        /**
         * @param number: A 3-digit number.
         * @return: Reversed number.
         */
        public int reverseInteger(int number) {
            // write your code here
            int a,b,c,temp;//
            a=number/100;//     ,   
            b=(number%100)/10;//   
            c=number%10;//   
            temp=c*100+b*10+a;//      
            return temp;
            
            
        }
    }

    5、 정렬 배열 병합
    본보기
    A = [1, 2, 3, 4], B = [2, 4, 5, 6] 을 주 고 돌아 갑 니 다. [1,2,2,3,4,4,5,6]
    도전 하 다.
    당신 은 당신 의 알고리즘 을 최적화 할 수 있 습 니까? 만약 그 중의 한 배열 이 크 고 다른 배열 이 매우 작다 면?
    생각:
    1. 길 이 를 A + B 길이 의 배열 로 정의 합 니 다.
    2. 발생 가능 한 상황:
    1 - A 와 B 는 모두 빈 배열 2 - A 와 B 는 모두 빈 배열 이 아니다 (길이 가 0 이 아니다) 3 - A 와 B 중 하 나 는 빈 배열 이다.
    상황 1: 새 배열 로 바로 돌아 가기 상황 2: 만족 상황 2 (길이 가 모두 0 보다 크다). A, B 에 대응 하 는 요소 (배열 요소 순환 비교 크기) 를 순서대로 비교 합 니 다.
    작은 것 은 먼저 배열 에 저장 하고 한 배열 이 모두 새 배열 에 삽입 되면 다른 배열 은 순서대로 새 배열 을 삽입 합 니 다.
    상황 3: 다른 배열 을 새 배열 에 직접 저장 합 니 다.
    public class Solution {
        /**
         * @param A: sorted integer array A
         * @param B: sorted integer array B
         * @return: A new sorted integer array
         */
        public int[] mergeSortedArray(int[] A, int[] B) {
            // write your code here
            int[] c=new int[A.length+B.length];//        ,         
            int index1=0;//  A  
            int index2=0;//  B  
            int curr=0;//c    
            //        
            while(index1

    6. 반전 배열 : n a, , , 。 [l,r] a[l], a[l+1], ..., a[r]。 a[1], a[2], ..., a[l-2], a[l-1], a[l], a[l+1], ..., a[r-1], a[r], a[r+1], a[r+2], ..., a[n-1], a[n], [l,r] a[1], a[2], ..., a[l-2], a[l-1], a[r], a[r-1], ..., a[l+1], a[l], a[r+1], a[r+2], ..., a[n-1], a[n]。
     
    입력  첫 번 째 줄 데 이 터 는 하나의 정수 이다. n (1 ≤ n ≤ 105) 은 배열 의 길 이 를 나타 낸다.두 번 째 줄 의 데 이 터 는 n 개의 정수 a [1], a [2], a [n] (1 ≤ a [i] ≤ 109) 이다. 
    샘플 입력  4 2 1 3 4  
    출력  "yes" 를 출력 합 니 다. 존재 한다 면;그렇지 않 으 면 "no" 를 출력 하고 따옴표 를 출력 하지 않 습 니 다. 
    샘플 출력  yes
     생각:
    1. 두 배열 a, b 를 정의 하고 할당 값 이 같 으 며 길이 가 같 습 니 다.
    2. 배열 b 를 오름차 순 으로 한다.
    3. 배열 a 의 요 소 를 배열 b 의 좌우 양쪽 과 순서대로 비교 하고 왼쪽 에서 배열 이 대응 하지 않 는 번호 left 를 기록 하 며 오른쪽 에서 두 수치 가 서로 다른 번호 right 를 기록 합 니 다.(2134) (1234) 왼쪽 부터 서로 다른 번호 left = 0;오른쪽 이 비교적 같 지 않 은 번 호 는 right = 1 이다.
    4. 마지막 으로 이 서로 다른 번호 간 에 교차 하 는 똑 같은 규칙 (21) (12) a [left + i] = = b [right - i] 을 만족 시 키 는 지 비교 합 니 다.이 규칙 을 만족 시 키 면, 이 출력 yes
    그렇지 않 으 면 no 출력;
    package com.demo.day8.list;
    
    import java.util.Arrays;
    import java.util.Scanner;
    /*     。
     *     :       n     a,      ,
     *              ,                   
     *             :n (1≤n≤105),      。
     *       n   a[1], a[2], ..., a[n] (1≤a[i]≤109)。
     *     “yes”,    ;    “no”,      。
     */
    public class ArrayTest {
    
    	public static void main(String[] args) {
    		//       
    		Scanner sc=new Scanner(System.in);
    		while(sc.hasNext()) {
    		int len=sc.nextInt();//           
    		// 1、      a、b,    ,    ;
    		int[]a=new int[len];//     A,   len
    		int[]b=new int[len];//     B,   len
    		for(int i=0;i

    7. 수열 의 합 을 구한다
    제목 설명:
    수열 의 정 의 는 다음 과 같다. 수열 의 첫 번 째 항목 은 n 이 고 앞으로 각 항목 은 앞의 제곱 근 이 며 수열 의 앞 m 항목 의 합 을 구한다.
    입력
    81 4 2 2
    입력 데 이 터 는 여러 그룹 이 있 고 각 그룹 은 한 줄 을 차지 하 며 두 개의 정수 n (n < 10000) 과 m (m < 1000) 로 구성 되 며 n 과 m 의 의 미 는 앞에서 말 한 바 와 같다.
    출력
    94.73 3.41
    각 조 의 입력 데이터 에 대해 이 수열 을 출력 하 는 것 과 모든 테스트 인 스 턴 스 가 한 줄 을 차지 하고 정밀도 가 2 비트 소 수 를 유지 해 야 합 니 다.
    
    import java.util.Scanner;
    
    public class Main {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		//  :
    		/*
    		 * 1         m   
    		 * 2     n              
    		 * 3     
    		 */
    		//       
    		Scanner sc=new Scanner(System.in);
    		while(sc.hasNext()) {//    
    			
    		double n=sc.nextInt();//      
    		int m=sc.nextInt();//     
    		double[] arr=new double[m];//       m       
    		
    		double num=0;//  
    		arr[0]=n;
    		for(int i=1;i

    8. 수선화 찾기
    /*      * 수선화 찾기     * 수선화 수 는 세 자리 수 를 말 하 는데 그 숫자 들 의 입방 은 그 자체 와 같다. 예 를 들 어 153 = 1 ^ 3 + 5 ^ 3 + 3 ^ 3     * 생각:     * 1. 길이 (n - m + 1) 배열 정의     * 2. 한 개의 수 를 꺼 내 고 백 자리, 열 자리, 한 자 리 를 구한다.     * 3. 만족 여 부 를 판단 하 는 새로운 배열 에 존재 하고 만족 하지 않 으 면 다음 을 찾 습 니 다.     */
    package com.test;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    
    public class Main2 {
    	/*
    	 *      
    	 *     ”       ,               ,  :153=1^3+5^3+3^3
    	 *   :
    	 * 1、      (n-m+1)  
    	 * 2、     ,     、  、  
    	 * 3、                 ,          
    	 */
    
    	public static void main(String[] args) {
    		Scanner sc=new Scanner(System.in);
    		
    		while(sc.hasNext()){
    //			String s=sc.nextLine();//          
    //			String[] array=s.split(" ");//         
    			int m=sc.nextInt();//      
    			int n=sc.nextInt();//       
    			//       n-m+1   
    			int[] arr= new int[20];
    			boolean flag=false;
    			int j=0;
    			for(int i=m;i=m&&i<=n) {
    					int a=i/100;//  
    					int b=(i%100)/10;//  
    					int c=(i%100)%10;//  
    					if((a*a*a+b*b*b+c*c*c)==(a*100+b*10+c))
    					{   
    							arr[j]=a*100+b*10+c;
    							j++;
    							flag=true;
    						}
    						
    					}
    
    			if(flag==true) {
    				for(int i=0;i

    9. 대소 문자 변환 II
    묘사 하 다.
    문자열 의 소문 자 를 대문자 로 변환 합 니 다. 알파벳 이 아 닌 다른 문 자 는 무시 합 니 다.
    본보기
    내놓다  "abc", 귀환  "ABC" .
    내놓다  "aBc", 귀환  "ABC" .
    내놓다  "abC12", 귀환  "ABC12" .
    생각:
    1. 빈 문자열 Newstr 정의
    2. 입력 한 문자열 의 모든 요 소 를 꺼 내 소문 자 여 부 를 판단 합 니 다.
    3. 소문 자 는 대문자 로 바 뀌 고 Newstr 에 추가 되 며, 그렇지 않 으 면 Newstr 문자열 에 직접 추가 합 니 다.
    public class Solution {
        /**
         * @param str: A string
         * @return: A string
         */
        public String lowercaseToUppercase2(String str) {
            // write your code here
            String newStr ="";//        
            for (int i = 0; i < str.length(); i++){//         
                char ch = str.charAt(i);//charAt(i)     i   
                if (Character.isLowerCase(ch)){//          
                    ch = Character.toUpperCase(ch);//     
                }
                newStr += ch;//            
            }
            return newStr;
        }
    }

    10. 수선화 찾기 II
    묘사 하 다.
    수선화 수의 정 의 는 이 수 는 그의 모든 상수 의 멱 차 의 합 과 같다 는 것 이다. 위 키 백과 의 정의 참조
    예 를 들 어 세 자리 의 십 진법 정수 153 는 하나의 수선화 수 이다. 153 = 13 이기 때문이다. + 53 + 33。
    그리고 한 4 자리 의 10 진수 1634 도 하나의 수선화 수 이다. 왜냐하면 1634 = 14 + 64 + 34 + 44。 n 을 주 고 n 자리 10 진 수선화 수 를 모두 찾 습 니 다.
    너 는 n 이 8 보다 작다 고 생각 할 수 있다.
    본보기
    예 를 들 면 n =  1 모든 수선화 수 는: [0,1,2,3,4,5,6,7,8,9] 이 고 n =  2, 2 자리 수선화 수 없 이 되 돌아 갑 니 다.  []
    사고의 방향
  • 한 자릿수 범 위 는 [0, 9] 이 고, 두 자릿수 범 위 는 [10, 99] 이 며, 세 자릿수 범 위 는 [100, 999] 이다. n 자릿수 범 위 는 [10 ^ (n - 1), (10 ^ n) - 1]
  • 이다.
  • 그래서 순환 을 하나 하 자. 1 =
  • 하나의 pow (m, n) 함 수 를 정의 하고 m 의 n 제곱 을 되 돌려 줍 니 다. 그 중에서 m 는 하나의 수의 개 비트, 10 비트, 백 비트 일 수 있 습 니 다.
  • 수선화 규칙 을 만족 시 키 는 배열 의 수 를 정의 합 니 다
  • package com.test;
    
    import java.util.ArrayList;
    
    public class Solution {
    
    	/*
    	 * @param n: The number of digits.
    	 * 
    	 * @return: All narcissistic numbers with n digits.
    	 */
    	public ArrayList getNarcissisticNumbers(int n) {
    		// write your code here
    		/*
    		 *       
    		 * 1.       
    		 * 2.    pow(m,n)  ,  m n      
    		 * 3.n          ,          ,       
    		 */
    		ArrayList result = new ArrayList();
    		if(n==1)
    		{
    			for(int i=0;i<10;i++){
    				result.add(i);
    			}
    			return result;
    		}
    			
    		for (int i = pow(10, n - 1); i <= (pow(10, n) - 1); i++) {// n     
    			int num = i;
    			int temp = 0;
    			for (int j = 0; j < n; j++) {
    				temp += pow((num % 10), n);//              
    				num = num / 10;//     、  、..
    			}
    			if (temp == i) {
    				result.add(temp);
    			}
    
    		}
    		return result;
    	}
    
    	public final int pow(int m, int n) {
    		int val = 1;
    		for (int i = 1; i <= n; ++i)
    			val *= m;//      
    		return val;
    	}
    }

    11. 링크 에서 노드 찾기
    묘사 하 다.
    링크 에서 값 이 value 인 노드 를 찾 습 니 다. 없 으 면 비어 있 습 니 다.
    본보기
    내놓다  1->2->3  value = 3 과 마지막 노드 last node 를 되 돌려 줍 니 다.
    내놓다  1->2->3  value = 4 와 비어 있 음 을 되 돌려 줍 니 다.
    
    public class Solution {
        /*
         * @param head: the head of linked list.
         * @param val: An integer.
         * @return: a linked node or null.
         */
        public ListNode findNode(ListNode head, int val) {
            // write your code here
            while(head!=null){
                if(head.val==val){//        ,        
                    return head;
                }
                head=head.next;//     ,     
            }
            return head;
        }
    }

    12. 링크 의 중심 점
    묘사 하 다.
    체인 시계의 중심 점 을 찾다.
    본보기
    체인 테이블  1->2->3  중점  2
    체인 테이블  1->2  중점  1
    도전 하 다.
    만약 링크 가 데이터 흐름 이 라면 링크 를 다시 옮 겨 다 니 지 않 고 중심 점 을 얻 을 수 있 습 니까?
    사고: 링크 를 옮 겨 다 니 며 링크 의 길 이 를 얻 을 수 있 습 니 다. 중심 점 의 위 치 는 (링크 길이 - 1) / 2 의 아래 표 시 된 위치 이 고 이 노드 로 돌아 갑 니 다.
    public class Solution {
        /**
         * @param head: the head of linked list.
         * @return: a middle node of the linked list
         */
        public ListNode middleNode(ListNode head) {
            //     ListNode  ,    
            ListNode ln =head;
            int i=0;
            while(head!=null){
                head=head.next;//    ,     ,       
                i++;
            }
            
            for(int j=0;j

    13. 문자열 을 정수 로 변환 하기 (쉬 운 버 전)
    묘사 하 다.
    Given a string, convert it to an integer. You may assume the string is a valid integer number that can be presented by a signed 32bit integer (-231 ~ 231-1).
    본보기
    내놓다  "123", 귀환  123 .
    public class Solution {
        /**
         * @param str: A string
         * @return: An integer
         */
        public int stringToInteger(String str) {
            // write your code here
            //valueOf Integer        ,
            //     string     Integer  
            //    Integer.valueOf("345")  ,345    Integer   
            return Integer.valueOf(str);
        }
    }

    좋은 웹페이지 즐겨찾기