目錄
力扣(LeetCode)定期刷題,每期10道題,業務繁重的同志可以看看我分享的思路,不是最高效解決方案,只求互相提升。
第1題:數組異或操作
試題要求如下:
回答(C語言):
int xorOperation(int n, int start){
int* data_buf = (int*)malloc(sizeof(int) * n);
int temp = 0;
memset(data_buf,0,sizeof(int) * n);
for(int i = 0;i < n;i++){
data_buf[i] = start+2*i;
}
temp = data_buf[0];
for(int i = 1;i < n;i++){
temp ^= data_buf[i];
}
return temp;
}
運行效率如下所示:
第2題:交換數字
試題要求如下:
解答思路:
異或思路:a ^ b = c c ^ b = a a ^ c = b
回答(C語言):
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* swapNumbers(int* numbers, int numbersSize, int* returnSize){
numbers[0] ^= numbers[1];
numbers[1] ^= numbers[0];
numbers[0] ^= numbers[1];
*returnSize = numbersSize;
return numbers;
}
運行效率如下所示:
第3題:按既定順序創建目標數組
試題要求如下:
回答(C語言):
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* createTargetArray(int* nums, int numsSize, int* index, int indexSize, int* returnSize){
int *returned = calloc(numsSize,sizeof(int));
for(int i=0;i<numsSize;i++){
for(int j=numsSize-1;j>index[i];j--){
returned[j] = returned[j-1];
}
returned[index[i]]=nums[i];
}
*returnSize = numsSize;
return returned;
}
運行效率如下所示:
第4題:數組中兩元素的最大乘積
試題要求如下:
回答(C語言):
int maxProduct(int* nums, int numsSize){
int m = 0, n = 0;
for (int i = 0; i < numsSize; i++){
if (nums[i] > m) {
n = m;
m = nums[i];
}
else
n = n > nums[i] ? n : nums[i];
}
return (m - 1)*(n - 1);
}
運行效率如下所示:
第5題:刪除鏈表中的節點
試題要求如下:
回答(C語言):
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
void deleteNode(struct ListNode* node) {
node->val = node->next->val;
node->next = node->next->next;
}
運行效率如下所示:
第6題:在既定時間做作業的學生人數
試題要求如下:
回答(C語言):
int busyStudent(int* startTime, int startTimeSize, int* endTime, int endTimeSize, int queryTime){
int cou = 0;
for(int i = 0;i < startTimeSize;i++){
if((startTime[i] <= queryTime) && (endTime[i] >= queryTime)){
cou++;
}
}
return cou;
}
運行效率如下所示:
第7題:二進制鏈表轉整數
試題要求如下:
回答(C語言):
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
int getDecimalValue(struct ListNode* head){
int sum = 0;
while (head != NULL) {
sum = (sum<<1) + head->val;
head = head->next;
}
return sum;
}
運行效率如下所示:
第8題:分割平衡字符串
試題要求如下:
回答(C語言):
int balancedStringSplit(char * s){
int len = strlen(s);
int temp = 0,cou = 0;
for(int i = 0;i < len;i++){
if(s[i] == 'R'){
temp++;
}
if(s[i] == 'L'){
temp--;
}
if(temp == 0){
cou++;
}
}
return cou;
}
運行效率如下所示:
第9題:不用加號的加法
試題要求如下:
解答思路:
普通加法中:例如 13 + 8
如果我們先將對應位子的數字相加,不考慮進位的話,應該是:
3 + 8 = 1 進位爲1
1 + 0 = 1 進位爲0
之後我們將個位的進位1 與十位上的1相加
1 + 1 = 2 進位爲0
如果我們將此方法帶入到二進制的運算中是否可行呢?
13 => 1101
8 => 1000
回答(C語言):
int add(int a, int b){
int sum = 0, carry = 0;
while(b != 0) {
sum = a^b; // 異或計算未進位的部分
carry = (unsigned int)(a&b)<<1; // 進位部分
a = sum; // 保存未進位部分,再次計算
b = carry; // 保存進位部分,再次計算
}
return a; // 最後無進位,異或的結果即加法結果
}
運行效率如下所示:
第10題:字符串相加
試題要求如下:
回答(C語言):
char * addStrings(char * num1, char * num2){
char* buf = (char*)malloc(sizeof(char) * 5101);
int i = strlen(num1) - 1, j = strlen(num2) - 1, k = 0, carry = 0;
while(i >= 0 || j >= 0 || carry != 0){
if(i >= 0) carry += num1[i--] - '0';
if(j >= 0) carry += num2[j--] - '0';
buf[k++] = carry % 10 + '0';
carry /= 10;
}
buf[k] = '\0';
i = 0;
j = k - 1;
while(i < j){
char c = buf[i];
buf[i] = buf[j];
buf[j] = c;
i++;
j--;
}
return buf;
}
運行效率如下所示: