您当前的位置: 首页 >  leetcode

不脱发的程序猿

暂无认证

  • 1浏览

    0关注

    492博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

不脱发的程序猿 发布时间:2020-06-25 10:46:20 ,浏览量:1

目录

第1题:数组异或操作

第2题:交换数字

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

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

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

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

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

第8题:分割平衡字符串

第9题:不用加号的加法

第10题:字符串相加

力扣(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;iindex[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)){
            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 = (sumnext;
    }
    
    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)= 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;
}

运行效率如下所示:

关注
打赏
1664101891
查看更多评论
立即登录/注册

微信扫码登录

0.0401s