目錄
力扣(LeetCode)定期刷題,每期10道題,業務繁重的同志可以看看我分享的思路,不是最高效解決方案,只求互相提升。
第1題:將整數轉換爲兩個無零整數的和
試題要求如下:
解答思路:
一對一對篩選,若一組數值某個數存在含0組成,則跳過該組。
回答(C語言):
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* getNoZeroIntegers(int n, int* returnSize){
int i = 1,j = n-1;
int temp = 0;
int* data_buf = (int*)malloc((2)*sizeof(int));
while(i<j){
temp = i;
while(temp % 10 != 0){
temp /= 10;
}
if(temp != 0){
i++;
j--;
continue;
}
temp = j;
while(temp % 10 != 0){
temp /= 10;
}
if(temp != 0){
i++;
j--;
continue;
}
break;
}
data_buf[0] = i;
data_buf[1] = j;
*returnSize = 2;
return data_buf;
}
運行效率如下所示:
第2題:一週中的第幾天
試題要求如下:
解答思路:
1、明確起點1971.1.1 - "Friday", 用最小值避免符號運算;
2、計算從1971.1.1到(day, month, year)的天數, 需要注意中間年份會有閏年, 另外當前年份需要單獨運算;
3、根據天數差值, 對7(一週7天)進行求餘, 並且需要考慮起點是"Friday"(週五)的偏移。
回答(C語言):
char * dayOfTheWeek(int day, int month, int year){
const char *s[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
if(year < 1971 || year > 2100) return NULL;
int daysOfMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int sum = 0;
for(int i = 1971; i < year; i ++)
{
if(0 == i % 400 || (0 != i % 100 && 0 == i % 4))
{
sum += 366;
}
else
{
sum += 365;
}
}
if(0 == year % 400 || (0 != year % 100 && 0 == year % 4))
{
daysOfMonth[1] = 29;
}
for(int i = 0; i < month - 1; i ++)
{
sum += daysOfMonth[i];
}
sum += day - 1;
return s[(sum + 5) % 7];
}
運行效率如下所示:
第3題:把二叉搜索樹轉換爲累加樹
試題要求如下:
解答思路:
在遞歸方法中,我們維護一些遞歸調用過程中可以訪問和修改的全局變量。首先我們判斷當前訪問的節點是否存在,如果存在就遞歸右子樹,遞歸回來的時候更新總和和當前點的值,然後遞歸左子樹。如果我們分別正確地遞歸 root.right 和 root.left ,那麼我們就能正確地用大於某個節點的值去更新此節點,然後才遍歷比它小的值。
回答(C語言):
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
static void dfs(struct TreeNode* psRoot, int* pSum)
{
if (NULL == psRoot)
{
return;
}
dfs(psRoot->right, pSum);
*pSum += psRoot->val;
psRoot->val = *pSum;
dfs(psRoot->left, pSum);
}
struct TreeNode* convertBST(struct TreeNode* root){
int sum = 0;
dfs(root, &sum);
return root;
}
運行效率如下所示:
第4題:連續字符
試題要求如下:
回答(C語言):
int maxPower(char * s){
int i,cou = 1,num = 0,len = strlen(s)-1;
char temp = s[0];
for(i = 1;i <= len;i++){
if(temp == s[i]){
cou++;
if(cou > num){
num = cou;
}
}
else{
cou = 1;
}
temp = s[i];
}
if(num == 0){
num = 1;
}
return num;
}
運行效率如下所示:
第5題:拿硬幣
試題要求如下:
回答(C語言):
int minCount(int* coins, int coinsSize){
int cou = 0;
int temp = 0;
for(int i = 0;i < coinsSize;i++)
{
temp = coins[i];
while(temp > 0){
cou++;
temp -= 2;
}
}
return cou;
}
運行效率如下所示:
第6題:刪除中間節點
試題要求如下:
解答思路:
將node->next指向的地址傳給node,然後釋放掉多餘節點。
注意給出的形參不是頭節點。
回答(C語言):
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
void deleteNode(struct ListNode* node) {
struct ListNode *t=node->next;
*node=*t;
free(t);
}
運行效率如下所示:
第7題:猜數字
試題要求如下:
解答思路:
第一次在力扣做這麼簡單的題,判斷每一位元素是否相等。
回答(C語言):
int game(int* guess, int guessSize, int* answer, int answerSize){
int cou = 0;
for(int i = 0;i < guessSize;i++){
if(guess[i] == answer[i]){
cou++;
}
}
return cou;
}
運行效率如下所示:
第8題:整數的各位積和之差
試題要求如下:
回答(C語言):
int subtractProductAndSum(int n){
int product = 1,sum = 0;
for(int i = 0,num = n;num > 0;i++){
product *= num%10;
sum += num%10;
num /= 10;
}
return product-sum;
}
運行效率如下所示:
第9題:一維數組的動態和
試題要求如下:
解答思路:
求取前綴和,直接對原數組求取,不用額外分配存儲空間。
回答(C語言):
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int *runningSum(int *nums, int numsSize, int *returnSize)
{
for(int i = 1;i < numsSize;i++){
nums[i] = nums[i] + nums[i-1];
}
*returnSize = numsSize;
return nums;
}
運行效率如下所示:
第10題:統計位數爲偶數的數字
試題要求如下:
回答(C語言):
int findNumbers(int* nums, int numsSize){
int temp = 0,cou = 0,data = 0;
for(int i = 0;i < numsSize;i++){
temp = nums[i];
while(temp > 0)
{
cou++;
temp /= 10;
}
if(cou%2 == 0){
data++;
}
cou = 0;
}
return data;
}
運行效率如下所示: