最后一個單詞的長度:
思路:跳過末尾的空格,可以從后向前遍歷
然后再利用?while(i>=0 && s[i] != '? ') 可以得到字符串的長度,
int lengthOfLastWord(char* s) {int length = 0;int i = strlen(s) - 1; //從字符串末尾開始//跳過末尾的空格:while(i>=0 && s[i] == ' '){i--;}while(i>=0 && s[i] != ' '){i--;length++;}return length;
}
?加一:
示例?1:
輸入:digits = [1,2,3] 輸出:[1,2,4] 解釋:輸入數組表示數字 123。示例?2:
輸入:digits = [4,3,2,1] 輸出:[4,3,2,2] 解釋:輸入數組表示數字 4321。示例 3:
輸入:digits = [9] 輸出:[1,0] 解釋:輸入數組表示數字 9。 加 1 得到了 9 + 1 = 10。 因此,結果應該是 [1,0]。
/*** Note: The returned array must be malloced, assume caller calls free().*/
int* plusOne(int* digits, int digitsSize, int* returnSize) {//從末尾開始處理,模擬加一操作int carry = 1;//創建一個新數組,用于存放加一后的結果int* result = (int*)malloc(sizeof(int) * (digitsSize + 1));//從后向前遍歷:// 0 1 2 3 4//eg 4 2 9 9//eg 4 3 0 0for(int i = digitsSize - 1; i >= 0;i--){int sum = digits[i] + carry;result[i + 1] = sum % 10;carry = sum / 10; //計算新的進位}//如果處理完仍有進位if(carry){result[0] = carry; //*returnSize = digitsSize + 1; //返回的數組大小增加1}else{for(int i = 0;i < digitsSize;i++){result[i] = result[i + 1];}*returnSize = digitsSize;}return result;
}
二進制求和:
?
示例?1:
輸入:a = "11", b = "1" 輸出:"100"示例?2:
輸入:a = "1010", b = "1011" 輸出:"10101"
char* addBinary(char* a, char* b) {int lenA = strlen(a);int lenB = strlen(b);int maxLen = lenA > lenB ? lenA : lenB;//為結果多加一位,以防最后有進位char* result = (char*)malloc(maxLen + 2); //一個給進位另一個給 '\0';int carry = 0;int index = 0;//從后向前進行二進制加法:while(lenA > 0 || lenB > 0 || carry){int bitA = lenA > 0 ? a[lenA - 1] - '0' : 0;int bitB = lenB > 0 ? b[lenB - 1] - '0' : 0;int sum = bitA + bitB + carry;result[index++] = (sum % 2) + '0'; // 存儲當前位carry = sum / 2; // 更新進位lenA--;lenB--;}// 結果數組反轉,因為從低位開始加result[index] = '\0'; // 添加字符串結束符// 修正反轉邏輯for (int i = 0, j = index - 1; i < j; i++, j--) {char temp = result[i];result[i] = result[j];result[j] = temp;}return result;
}
?x的平方:
奇怪,二分法用?
mid = (left + right) / 2;就不行
int mid = left + (right - left) / 2; 就是可以的
通過改成
mid = left + (right - left) / 2;
,我們首先計算right - left
,這通常不會超出int
的范圍,因為right - left
的差值一般比left + right
的和要小得多。然后,除以 2 后,計算出的結果不會超出int
的范圍,最后再加上left
,得出的mid
也不會溢出。例如:
- 假設?
left = 2,000,000,000
?和?right = 2,000,000,000
,計算?right - left = 0
,然后?0 / 2 = 0
,最后?mid = 2,000,000,000 + 0 = 2,000,000,000
,完全在范圍內。這種方法保證了加法操作總是先進行小的差值計算,避免了大數相加導致溢出的風險。
int mySqrt(int x) {if (x == 0) return 0;int left = 1,right = x;while (left <= right){int mid = left + (right - left) / 2;long long square = (long long) mid * mid;if (square == x){return mid;}else if (square > x){right = mid - 1;}else{left = mid + 1;}}return right;}
?二叉樹前序遍歷:
#include <bits/stdc++.h>struct treeNode{int val;struct treeNode *left;struct treeNode *right;
};void preOrder(struct treeNode* root,int* res,int* resSize) {if(root = NULL) return ;res[(*resSize)++] = root->val;preOrder(root->left,res,resSize);preOrder(root->right,res,resSize);
}
int ii(struct treeNode* root,int* returnSize){int* res = (int*)malloc(sizeof(int) * 101);int *returnSize = 0;preOrder(root,res,returnSize);return res;
}
刪除排序鏈表中的重復元素:
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/
struct ListNode* deleteDuplicates(struct ListNode* head) {if(head == NULL){return head;}struct ListNode* current = head;//遍歷列表while(current != NULL && current->next != NULL){//如果當前節點的值和下一次節點的值相同if(current->val == current->next->val){//跳過,下一個節點struct ListNode* temp = current->next;current->next = temp->next;free(temp);}else{current = current->next;}}return head;
}