当前位置:   article > 正文

c语言a b的和 不用加号,力扣(LeetCode)刷题,简单题(第16期)

c j=numssize-1

目录

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

第1题:数组异或操作

试题要求如下:

d28b2e089d7de8db5016c9ce46549c0f.png

回答(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;

}

运行效率如下所示:

397d9391a88df03f9b2717c30abae6d9.png

第2题:交换数字

试题要求如下:

18db924921bd6cf8414f421996d3755b.png

解答思路:

异或思路: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;

}

运行效率如下所示:

185bdb890e6bb3ee11461bd529369a57.png

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

试题要求如下:

d767a6b29a6a72721674b75169e69e52.png

回答(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

for(int j=numsSize-1;j>index[i];j--){

returned[j] = returned[j-1];

}

returned[index[i]]=nums[i];

}

*returnSize = numsSize;

return returned;

}

运行效率如下所示:

a6ebbc7782c5d7725d2659c620386d7a.png

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

试题要求如下:

a45ce5b06aa58dca25ad1aa4188e9d5e.png

回答(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);

}

运行效率如下所示:

eb1601747376a0cb4990d6583dc335b9.png

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

试题要求如下:

f65f2099d61cc16fd50224050e017695.png

回答(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;

}

运行效率如下所示:

ee6f3f5deda8a0432e1d30730b7347a3.png

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

试题要求如下:

8037da9ea1c0ee2ea30c266c1f793a47.png

回答(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;

}

运行效率如下所示:

f9774130863f4dc5a6d0c628571d3b96.png

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

试题要求如下:

41b713acd06858f79b17213c8e2c4a1e.png

回答(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;

}

运行效率如下所示:

38cf57605e0a85376cce9e88bd97222b.png

第8题:分割平衡字符串

试题要求如下:

77dae32d73ccf08d4f869b446098ed1b.png

回答(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;

}

运行效率如下所示:

5981eb2bb06f5c219bb0782ddf5b354b.png

第9题:不用加号的加法

试题要求如下:

0d46d4192d523af56f29732f6b996d86.png

解答思路:

普通加法中:例如 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;// 最后无进位,异或的结果即加法结果

}

运行效率如下所示:

76297d4beb3532d171fc570926ec2f5f.png

第10题:字符串相加

试题要求如下:

745d31e5f0d218c91d9dcd5346f28703.png

回答(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;

}

运行效率如下所示:

0726e24ffa5203a92dcce00d44f1b01e.png

本文分享 CSDN - 不脱发的程序猿。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/175641
推荐阅读
相关标签
  

闽ICP备14008679号