力扣(LeetCode)刷题,简单题(第16期)

目录

第1题:数组异或操作

第2题:交换数字

第3题:按既定顺序创建目标数组

第4题:数组中两元素的最大乘积

第5题:删除链表中的节点

第6题:在既定时间做作业的学生人数

第7题:二进制链表转整数

第8题:分割平衡字符串

第9题:不用加号的加法

第10题:字符串相加


力扣(LeetCode)定期刷题,每期10道题,业务繁重的同志可以看看我分享的思路,不是最高效解决方案,只求互相提升。

第1题:数组异或操作

试题要求如下:

回答(C语言):


  
  1. int xorOperation(int n, int start){
  2. int* data_buf = (int*)malloc(sizeof(int) * n);
  3. int temp = 0;
  4. memset(data_buf,0,sizeof(int) * n);
  5. for(int i = 0;i < n;i++){
  6. data_buf[i] = start+2*i;
  7. }
  8. temp = data_buf[0];
  9. for(int i = 1;i < n;i++){
  10. temp ^= data_buf[i];
  11. }
  12. return temp;
  13. }

运行效率如下所示:


第2题:交换数字

试题要求如下:

解答思路:

异或思路:a ^ b = c  c ^ b = a  a ^ c = b

回答(C语言):


  
  1. /**
  2. * Note: The returned array must be malloced, assume caller calls free().
  3. */
  4. int* swapNumbers(int* numbers, int numbersSize, int* returnSize){
  5. numbers[0] ^= numbers[1];
  6. numbers[1] ^= numbers[0];
  7. numbers[0] ^= numbers[1];
  8. *returnSize = numbersSize;
  9. return numbers;
  10. }

运行效率如下所示:


第3题:按既定顺序创建目标数组

试题要求如下:

回答(C语言):


  
  1. /**
  2. * Note: The returned array must be malloced, assume caller calls free().
  3. */
  4. int* createTargetArray(int* nums, int numsSize, int* index, int indexSize, int* returnSize){
  5. int *returned = calloc(numsSize,sizeof(int));
  6. for(int i=0;i<numsSize;i++){
  7. for(int j=numsSize-1;j>index[i];j--){
  8. returned[j] = returned[j-1];
  9. }
  10. returned[index[i]]=nums[i];
  11. }
  12. *returnSize = numsSize;
  13. return returned;
  14. }

运行效率如下所示:


第4题:数组中两元素的最大乘积

试题要求如下:

回答(C语言):


  
  1. int maxProduct(int* nums, int numsSize){
  2. int m = 0, n = 0;
  3. for (int i = 0; i < numsSize; i++){
  4. if (nums[i] > m) {
  5. n = m;
  6. m = nums[i];
  7. }
  8. else
  9. n = n > nums[i] ? n : nums[i];
  10. }
  11. return (m - 1)*(n - 1);
  12. }

运行效率如下所示:


第5题:删除链表中的节点

试题要求如下:

回答(C语言):


  
  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * struct ListNode *next;
  6. * };
  7. */
  8. void deleteNode(struct ListNode* node) {
  9. node->val = node->next->val;
  10. node->next = node->next->next;
  11. }

运行效率如下所示:


第6题:在既定时间做作业的学生人数

试题要求如下:

回答(C语言):


  
  1. int busyStudent(int* startTime, int startTimeSize, int* endTime, int endTimeSize, int queryTime){
  2. int cou = 0;
  3. for(int i = 0;i < startTimeSize;i++){
  4. if((startTime[i] <= queryTime) && (endTime[i] >= queryTime)){
  5. cou++;
  6. }
  7. }
  8. return cou;
  9. }

运行效率如下所示:


第7题:二进制链表转整数

试题要求如下:

回答(C语言):


  
  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * struct ListNode *next;
  6. * };
  7. */
  8. int getDecimalValue(struct ListNode* head){
  9. int sum = 0;
  10. while (head != NULL) {
  11. sum = (sum<<1) + head->val;
  12. head = head->next;
  13. }
  14. return sum;
  15. }

运行效率如下所示:


第8题:分割平衡字符串

试题要求如下:

回答(C语言):


  
  1. int balancedStringSplit(char * s){
  2. int len = strlen(s);
  3. int temp = 0,cou = 0;
  4. for(int i = 0;i < len;i++){
  5. if(s[i] == 'R'){
  6. temp++;
  7. }
  8. if(s[i] == 'L'){
  9. temp--;
  10. }
  11. if(temp == 0){
  12. cou++;
  13. }
  14. }
  15. return cou;
  16. }

运行效率如下所示:


第9题:不用加号的加法

试题要求如下:

解答思路:

普通加法中:例如 13 + 8

如果我们先将对应位子的数字相加,不考虑进位的话,应该是:

3 + 8 = 1 进位为1

1 + 0 = 1 进位为0

之后我们将个位的进位1 与十位上的1相加

1 + 1 = 2 进位为0

如果我们将此方法带入到二进制的运算中是否可行呢?

13 => 1101

8 => 1000

回答(C语言):


  
  1. int add(int a, int b){
  2. int sum = 0, carry = 0;
  3. while(b != 0) {
  4. sum = a^b; // 异或计算未进位的部分
  5. carry = (unsigned int)(a&b)<<1; // 进位部分
  6. a = sum; // 保存未进位部分,再次计算
  7. b = carry; // 保存进位部分,再次计算
  8. }
  9. return a; // 最后无进位,异或的结果即加法结果
  10. }

运行效率如下所示:


第10题:字符串相加

试题要求如下:

回答(C语言):


  
  1. char * addStrings(char * num1, char * num2){
  2. char* buf = (char*)malloc(sizeof(char) * 5101);
  3. int i = strlen(num1) - 1, j = strlen(num2) - 1, k = 0, carry = 0;
  4. while(i >= 0 || j >= 0 || carry != 0){
  5. if(i >= 0) carry += num1[i--] - '0';
  6. if(j >= 0) carry += num2[j--] - '0';
  7. buf[k++] = carry % 10 + '0';
  8. carry /= 10;
  9. }
  10. buf[k] = '\0';
  11. i = 0;
  12. j = k - 1;
  13. while(i < j){
  14. char c = buf[i];
  15. buf[i] = buf[j];
  16. buf[j] = c;
  17. i++;
  18. j--;
  19. }
  20. return buf;
  21. }

运行效率如下所示:

文章来源: handsome-man.blog.csdn.net,作者:不脱发的程序猿,版权归原作者所有,如需转载,请联系作者。

原文链接:handsome-man.blog.csdn.net/article/details/106895323

(完)