LeetCode 브러시 질문 : 기타

아날로그 곱셈

오랫동안 직접 사용할 수 없으며 문제는 오버플로가 발생한다는 것입니다.
곱셈을 수동으로 만 시뮬레이션 할 수 있습니다.
여기에 사진 설명 삽입여기에 사진 설명 삽입

class Solution {
    
    
    public String multiply(String num1, String num2) {
    
    
        if (num1.equals("0") || num2.equals("0")) {
    
    
            return "0";
        }
        String ans = "0";
        int m = num1.length(), n = num2.length();
        for (int i = n - 1; i >= 0; i--) {
    
    
            StringBuffer curr = new StringBuffer();
            int add = 0;
            for (int j = n - 1; j > i; j--) {
    
    
                curr.append(0); // 模拟× 10 的场景
            }
            int y = num2.charAt(i) - '0';
            for (int j = m - 1; j >= 0; j--) {
    
    
                int x = num1.charAt(j) - '0';
                int product = x * y + add;
                curr.append(product % 10);
                add = product / 10;
            }
            if (add != 0) {
    
    
                curr.append(add % 10);
            }
            ans = addStrings(ans, curr.reverse().toString());
        }
        return ans;
    }
 
    public String addStrings(String num1, String num2) {
    
    
        int i = num1.length() - 1, j = num2.length() - 1, add = 0;
        StringBuffer ans = new StringBuffer();
        while (i >= 0 || j >= 0 || add != 0) {
    
     // add直接在这里处理
            int x = i >= 0 ? num1.charAt(i) - '0' : 0; // 防止越位以及最后判断谁越位
            int y = j >= 0 ? num2.charAt(j) - '0' : 0;
            int result = x + y + add;
            ans.append(result % 10); // 本次添加余数
            add = result / 10; // 留给下次的是本次的结果
            i--;
            j--;
        }
        ans.reverse();
        return ans.toString();
    }
}

더 간단하게 :

BigDecimal n1 = new BigDecimal(num1);
BigDecimal n2 = new BigDecimal(num2);
BigDecimal res = n1.multiply(n2);
return res.toPlainString();

149. 직선에 가장 많은 점이있는 나무

여기에 사진 설명 삽입
Y = kx + b
는 모든 kb 찾고, 두 점은 kb, n의 제곱의 순회를 결정한
다음 계산 공식을 충족하는 좌표를 열거
하여 가장 큰 수 찾습니다.

아날로그 전력

https://leetcode-cn.com/problems/powx-n/
여기에 사진 설명 삽입

class Solution {
    
    
    public double myPow(double x, int n) {
    
    
        long N = n;
        return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N);
    }
 
    public double quickMul(double x, long N) {
    
    
        if (N == 0) {
    
    
            return 1.0;
        }
        double y = quickMul(x, N / 2);
        return N % 2 == 0 ? y * y : y * y * x;
    }
}

인플레 이스 해시

https://leetcode-cn.com/problems/find-all-duplicates-in-an-array/
여기에 사진 설명 삽입문제 해결 아이디어
추가 메모리 공간을 사용하지 않는 경우 배열 요소 만 수정하여 다음 여부를 표시 할 수 있습니다.
원칙에 액세스 한 경우 : 동일한 요소 인 경우 동일한 값의 특정 요소 값의 색인으로 가져 가면이 값을 수정하여 플래그를 지정할 수 있습니다
. 참고 : 요소를 제자리에서 수정해야합니다. 색인으로 자신의 액세스에 영향을 줄 수는 없으며 한 가지 방법이 있습니다. 즉, 요소를 반전하거나 특정 숫자를 더하거나 뺀 다음 방문 할 때 양수를 취하거나 특정 수를 더하거나 빼서 복원하는 것입니다. .

index와 a [index] 사이의 관계를 사용하여
요소 값 n을 취한 다음 a [abs (n)]를 부정합니다.
다음에 a [abs (n)]이 음수이면 이전에 방문한 적이 있음을 의미합니다. 결과 세트를 직접 결합하십시오.

비트 작동

상태를 나타내는 비트를 사용하여 해시의 아이디어와 약간 유사합니다.

하위 집합을 찾는 주제 :
https://leetcode-cn.com/problems/subsets/solution/zi-ji-by-leetcode-solution/
여기에 사진 설명 삽입여기에 사진 설명 삽입핵심 아이디어 :

  1. 무차별 대입 검색
  2. 비트를 사용하여 해당 위치의 배열이 활성화되었는지 여부를 나타냅니다.

핵심 코드 :

for (int mask = 0; mask < (1 << n); ++mask) {
    
    
            t.clear();
            for (int i = 0; i < n; ++i) {
    
    
                if ((mask & (1 << i)) != 0) {
    
    
                    t.add(nums[i]);
                }
            }
            ans.add(new ArrayList<Integer>(t));
        }

암호:

class Solution {
    
    
    List<Integer> t = new ArrayList<Integer>();
    List<List<Integer>> ans = new ArrayList<List<Integer>>();
 
    public List<List<Integer>> subsets(int[] nums) {
    
    
        int n = nums.length;
        for (int mask = 0; mask < (1 << n); ++mask) {
    
    
            t.clear();
            for (int i = 0; i < n; ++i) {
    
    
                if ((mask & (1 << i)) != 0) {
    
    
                    t.add(nums[i]);
                }
            }
            ans.add(new ArrayList<Integer>(t));
        }
        return ans;
    }
}

폭력적인 해결책 : 작은 문제의 해결책은 큰 문제의 해결책을 구성합니다
여기에 사진 설명 삽입

기존 세트에 추가 된 새 요소는 새 세트가 된 다음 여기에 던져집니다.
여기에 사진 설명 삽입

191. 비트 수 1

https://leetcode-cn.com/problems/number-of-1-bits/
여기에 사진 설명 삽입

키 포인트:

  1. 32 비트 내에서 즉, << 1의 연산은 최대 32 회입니다.

https://leetcode-cn.com/problems/number-of-1-bits/solution/wei-1de-ge-shu-by-leetcode/

public int hammingWeight(int n) {
    
    
    int bits = 0;
    int mask = 1;
    for (int i = 0; i < 32; i++) {
    
    
// 最多32次
        if ((n & mask) != 0) {
    
    
            bits++; // 为1的位数
        }
        mask <<= 1;
    }
    return bits;
}

AND 연산자는 "&"기호로 표시되며 사용 규칙은 다음과 같습니다.
두 피연산자는 모두 1이고 결과는 1입니다. 그렇지 않으면 결과는 다음 블록과 같이 0입니다.
129 & 128 = 128. "a"의 값은 129이고 2 진수로 변환 된 값은 10000001이고 "b"의 값은 128이고 2 진수로 변환 된 값은 10000000입니다. AND 연산자의 연산 규칙에 따르면 2 비트 만 1이고 결과는 1이며 결과는 10000000 (128)임을 알 수 있습니다.

관련 레코드 정렬

  1. 작업 스케줄러 : 냉각 시간으로 명령을 실행하는 데 가장 짧은 시간입니다. 621
    https://leetcode-cn.com/problems/task-scheduler/
    솔루션 1 : 정렬. 정렬은 우선 순위를 확인하는 것으로, 각 라운드에서 가장 큰 값을 가진 요소가 먼저 제거됩니다.
  2. 공개 간격 병합 : https://leetcode-cn.com/problems/merge-intervals/solution/zhen-dui-xin-shou-jian-ji-yi-dong-de-ti-jie-liang-/sort
    및 비교 합병 후.
    또 다른 해결책 : 부울 배열을 표시합니다.이 솔루션은 공통 간격으로 계산되지 않는 상황을 처리 할 수 ​​없습니다 : [1,4] [5,6].
  3. 두 개의 정렬 된 사용자 지정 연결 목록 병합 : https://leetcode-cn.com/problems/merge-two-sorted-lists/solution/he-bing-liang-ge-you-xu-lian-biao-by- leetcode /
  4. 내부 정렬을위한 이중 포인터 방법 : https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/submissions/

추천

출처blog.csdn.net/weixin_38370441/article/details/115251343