LeetCodeブラシの質問、簡単な質問(問題23)

目次

質問1:整数変換

質問2:繰り返し部分文字列

質問3:範囲合計2

質問4:番号を逆にします

質問5:数値を16進数に変換する

質問6:文字とバックスペースを比較する

質問7:3つの数値の最大積

質問8:ビーズの計算

質問9:弦の回転

質問10:大きなグループの場所


LeetCodeは、問題ごとに10の質問を定期的にブラッシングします。ビジネスの重い仲間は、私が共有したアイデアを見ることができます。これは、最も効率的なソリューションではなく、お互いの改善のみを目的としています。

質問1:整数変換

テストの質問は次のとおりです。

アイデアに答える:

XOR演算。

回答(C言語):

int convertInteger(int A, int B){
    int res=0;

    unsigned int tmp = A^B;

    while(tmp){
        if(tmp&1==1){
            res=res+1;
        }
        
        tmp>>=1;
    }

    return res;
}

運用効率は次のとおりです。


質問2:繰り返し部分文字列

テストの質問は次のとおりです。

アイデアに答える:

回答(C言語):

bool repeatedSubstringPattern(char* s) {
    int n = strlen(s);

    for (int i = 1; i * 2 <= n; ++i) {
        if (n % i == 0) {
            bool match = true;

            for (int j = i; j < n; ++j) {
                if (s[j] != s[j - i]) {
                    match = false;
                    break;
                }
            }
            
            if (match) {
                return true;
            }
        }
    }

    return false;
}

運用効率は次のとおりです。


質問3:範囲合計2

テストの質問は次のとおりです。

アイデアに答える:

これを行う最も簡単な方法は、指定された2次元行列の最初の列と2番目の列で最小の数を見つけることです。これは、配列の各行の2つの数を長方形に分割でき、最後と最大の数が同じでなければならないためです。の重複部分なので、配列の各列の最小値を見つけるだけで、積が必要なものになります。

回答(C言語):

int maxCount(int m, int n, int** ops, int opsSize, int* opsColSize){
    int min_c = m, min_r = n;

    for(int i = 0;i < opsSize;i++){
        if(ops[i][0] < min_c){
            min_c = ops[i][0];
        }
        if(ops[i][1] < min_r){
            min_r = ops[i][1];
        }
    }

    return min_c * min_r;
}

運用効率は次のとおりです。


質問4:番号を逆にします

テストの質問は次のとおりです。

回答(C言語):

void toBit(int num, int *val) {
    int i = 0;
    while(num) {
        val[i] = num & 1;
        num >>= 1;
        i++;
    }
}

int reverseBits(int num){
    int val[32] = {0};
    toBit(num, val);
    
    int count = 0;
    int countPre = 0;
    int max = 0;
    for (int i = 0; i < 32; i++) {
        if (val[i] == 1) {
            count++;
        } 
        else {
            if (countPre + count + 1 > max) {
                max = countPre + count + 1;
            }
            countPre = count;
            count = 0;
        }
    }

    return max;
}

運用効率は次のとおりです。


質問5:数値を16進数に変換する

テストの質問は次のとおりです。

アイデアに答える:

残りを取り、16(0X0F)で除算し、配列にロードしてから逆にします。

回答(C言語):

char g_stack[16 + 1] = {0};
void swap(char *a, char *b) {char t = *a; *a = *b; *b = t; }

char * toHex(int num) {
    int top = -1;
    unsigned int n = num;
    char index[] = "0123456789abcdef";

    // 这里用do...while()而不是while(),能直接覆盖num为0的情况
    do {
        g_stack[++top] = index[n % 16];
        n /= 16;
    } while (n != 0);
    g_stack[top + 1] = '\0';

    int lo = 0, hi = top;

    while (lo < hi) {
        swap(&g_stack[lo++], &g_stack[hi--]);
    }
    
    return g_stack;
}

運用効率は次のとおりです。


質問6:文字とバックスペースを比較する

テストの質問は次のとおりです。

アイデアに答える:

ダブルポインターを使用すると、 '#'が検出されると、下付き文字が1つ減り、前の文字が削除されます。他の文字が下付き文字の数を順番に増やし、新しい文字列を取得して、文字列が同じかどうかを比較します。

回答(C言語):

int deletebackspace(char *str,int size){
    if(str==NULL||size==0){
        return 0;
    }

    int index = 0;

    for(int i=0;i<size;i++){
        if(str[i] != '#'){
            str[index++] = str[i];
        }
        else{
            if(index>0){
                index--;
            }
        }
    }

    return index;
}

bool backspaceCompare(char * S, char * T){
    int slen = deletebackspace(S,strlen(S));
    int tlen = deletebackspace(T,strlen(T));

    if(slen != tlen){
        return false;
    }
    else{
        for(int i=0;i<slen;i++){
            if(S[i] != T[i]){
                return false;
            }
        }
        
        return true;
    }
}

運用効率は次のとおりです。


質問7:3つの数値の最大積

テストの質問は次のとおりです。

アイデアに答える:

配列を昇順で並べ替え、配列内のすべての要素が負でない場合、答えは最後の3つの要素の積です。

配列に負の数がある場合は、積に負の数が含まれていることも考慮する必要があります。明らかに、最小の2つの負の数と最大の正の数を選択することが最適です。つまり、最初の2つの要素と最後の要素の積です。

回答(C言語):

int Compare(const void* a, const void* b)
{
    return *(int*)a - *(int*)b;
}

int Max(int a, int b)
{
    return a > b ? a : b;
}

int maximumProduct(int* nums, int numsSize){
    qsort(nums, numsSize, sizeof(int), Compare);
    
    return Max(nums[numsSize - 1] * nums[numsSize -2] * nums[numsSize - 3], nums[numsSize - 1] * nums[0] * nums[1]);
}

運用効率は次のとおりです。


質問8:ビーズの計算

テストの質問は次のとおりです。

回答(C言語):

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* masterMind(char* solution, char* guess, int* returnSize){
    returnSize[0] = 2;
    int dict[26] = {0}, *res = (int *)malloc (sizeof (int) * 2);
    res[0] = res[1] = 0;

    for (int i = 0; solution[i] != '\0'; ++i) {
        dict[solution[i] -'A']++;
        if (guess[i] == solution[i]) res[0]++;
    }

    for (int i = 0; solution[i] != '\0'; ++i) {
        if (dict[guess[i] - 'A']) {
            dict[guess[i] - 'A']--;
            res[1]++;
        }
    }
    
    res[1] -= res[0];
    return res;
}

運用効率は次のとおりです。


質問9:弦の回転

テストの質問は次のとおりです。

回答(C言語):

bool rotateString(char * A, char * B){
    int len = strlen(A);

    if(strlen(B) != len) return false;
    if(strcmp(A, B) == 0) return true;

    for(int i = 0; i < len; i++) {
        if(A[0] == B[i]) {
            int j;
            
            for(j=0; j < len; j++) {
                if(j<i && A[j+len-i] != B[j]) {
                    break;
                }
                if(j >= i && A[j-i] != B[j]) {
                    break;
                }
            }

            if(j == len) {
                return true;
            }
        }
    }

    return false;
}

運用効率は次のとおりです。


質問10:大きなグループの場所

テストの質問は次のとおりです。

回答(C言語):

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
int** largeGroupPositions(char * S, int* returnSize, int** returnColumnSizes){
    int size = 0;
    int len =strlen(S);

    if(len < 3){
        *returnSize = 0;
        ** returnColumnSizes = 0;
        return 0;
    }

    int ** res = (int **)malloc(len * sizeof(int *));
    for(int i=0;i<len;i++){
        res[i] = (int *)calloc(2,sizeof(int));
    }

    for(int i=0; i<len-2 ; i++){
        if( S[i] == S[i+1] && S[i] == S[i+2]){
            (*returnColumnSizes)[size] = 2;
            char temp = S[i];
            res[size][0]=i;
            i+=3;
            while(temp == S[i] && i<len) i++;
            res[size][1]=--i;                   //由于循环体内有i++,此处的S[i]已经是新值的起始点,为了一致,应退回1
            size++;   
        }
    }
    
    *returnSize = size;
    return res;
}

運用効率は次のとおりです。

おすすめ

転載: blog.csdn.net/m0_38106923/article/details/108213568