目次
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;
}
運用効率は次のとおりです。