博客
关于我
【Leecode笔记之C语言】第五周(10.5-10.11)
阅读量:354 次
发布时间:2019-03-04

本文共 4146 字,大约阅读时间需要 13 分钟。

上周咸鱼了,这周再次重新做人!

【DAY 12】解压缩编码列表

在这里插入图片描述

分析:奇数位的数字用来判断重复数量,偶数位的数字用来作为重复数字;然后还要连接各个子列表。

难点在于,1.如何将多个子数组串联在一起?(控制频次和遍历原数组可以用双层for循环完成。用python应该会简单多了,用V有点麻烦。)2.如何确定目标数组的长度?
解决:首先确定目标数组的长度,就是两步,原数组的偶数位,偶数位的值控制频次。

int* decompressRLElist(int* nums, int numsSize, int* returnSize){       *returnSize = 0;    int len = numsSize / 2;    for(int i = 0;i < len;i++){           *returnSize += nums[2*i];    }    int index = 0;    int *ret = (int *) calloc (*returnSize,sizeof(int));    for(int k = 0;k < numsSize;k+=2){           for(int j = 0;j < nums[k];j++){               ret[index++] = nums[k+1];         }    }    return ret;}

【DAY 13】

第一题:将数字变成0的操作次数

在这里插入图片描述

分析:思路挺简单的,只要num不为0,如果是奇数就-1,如果是偶数就/2,然后定义一个计数器统计次数即可。

int numberOfSteps (int num){       int count = 0;    while(num !=0){           if(num % 2 == 0){               num/=2;            count++;        }        else{               num-=1;            count++;        }    }    return count;}

第二题:有多少小于当前数字的数字

在这里插入图片描述分析:这题思路也挺简单的,首先第一层for循环控制顺序遍历,然后将比较结果放置到返回数组中,第二层for循环控制遍历比较。

int* smallerNumbersThanCurrent(int* nums, int numsSize, int* returnSize){       int *retArr = (int*)malloc((sizeof(int))*numsSize);    for(int i = 0;i < numsSize;i++){           int count = 0;        for(int j = 0;j < numsSize;j++){               if((i!=j)&&(nums[j] < nums[i])){                   count++;            }        }        retArr[i] = count;     }    *returnSize = numsSize;    return retArr;}

【DAY 14】

第一题:访问所有点的最小时间

在这里插入图片描述

分析:这题目让我想起了以前本科做的五子棋项目。假如说目标点的横坐标相同,或者纵坐标相同,那么就可以选择直走,假如都不同,那就斜着走,走对角线。(感觉用java写会容易一点)
假如说考虑到各点的遍历顺序会要难一点,但是题目只要求按照数组提供的点的顺序。
思路是利用切比雪夫距离,用二维数组来计算两点之间横坐标和纵坐标的差。

方法一:切比雪夫距离

对于平面上的两个点 x = (x0, x1) 和 y = (y0, y1),设它们横坐标距离之差为 dx = |x0 - y0|,纵坐标距离之差为 dy = |x1 - y1|,对于以下三种情况,我们可以分别计算出从 x 移动到 y 的最少次数:

dx < dy:沿对角线移动 dx 次,再竖直移动 dy - dx 次,总计 dx + (dy - dx) = dy 次;dx == dy:沿对角线移动 dx 次;dx > dy:沿对角线移动 dy 次,再水平移动 dx - dy 次,总计 dy + (dx - dy) = dx 次。

可以发现,对于任意一种情况,从 x 移动到 y 的最少次数为 dx 和 dy 中的较大值 max(dx, dy),这也被称作 x 和 y 之间的 切比雪夫距离。

作者:LeetCode-Solution

链接:https://leetcode-cn.com/problems/minimum-time-visiting-all-points/solution/fang-wen-suo-you-dian-de-zui-xiao-shi-jian-by-le-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

int minTimeToVisitAllPoints(int** points, int pointsSize, int* pointsColSize){       int i,time = 0,dx,dy;    for(i = 1;i < pointsSize;i++){           dx = abs(points[i][0] - points[i-1][0]);        dy = abs(points[i][1] - points[i-1][1]);        if(dx < dy){               time += dy;        }        else{               time += dx;        }    }    return time;}

这里points[i][0],其中i控制的是数组中的各个数的坐标,0指的是横坐标,合起来就能顺序遍历每个数的横坐标;

同理points[i][1],其中i控制的是数组中的各个数的坐标,0指的是纵坐标,合起来就能顺序遍历每个数的纵坐标。
这里感觉关系有点绕,写出来代入实例会理解得好一点。

第二题:统计位数为偶数的数字

在这里插入图片描述分析:思路挺简单,就是将数组中的每一位不断除以10(直到为0)统计次数,然后用一个计数器来存放操作次数为奇数的个数。(为什么是奇数,是因为最后一位没有算进除以10的操作次数里)

int findNumbers(int* nums, int numsSize){       int num;    int total = 0;    for(int i = 0;i < numsSize;i++){           num = 0;//假如说把这句代码放在int total = 0;下边,测试用例能过,但是提交就是错的        while(nums[i] != 0){               nums[i] /= 10;            num++;        }        if(num % 2 == 0){               total++;        }    }    return total;}

【DAY 15】

第一题:矩阵对角线元素的和

在这里插入图片描述分析:要计算特定位置的元素和的话,那么就必须要找到这些位置的元素的相似性。首先,主对角线上的元素共同点是,横坐标和纵坐标是一样的,副对角线上的元素共同点是,横坐标和纵坐标相加等于方阵的最大列号(或者行号)。最后,既在主对角线上又在副对角线上的元素只能算一次,也就是说同时满足上边两点。

int diagonalSum(int** mat, int matSize, int* matColSize){       int  sum = 0;    int common = 0;    for(int i = 0;i < matColSize;i++){           for(int j = 0;j < matColSize;j++){               if((i == j)||(i+j== matColSize)){                   sum+=mat[i][j];            }            if(i == j)&&(i+j== matColSize)){                   common = mat[i][j];            }        }    }    return (sum-common);}

第二题:速算机器人

分析:首先就是要解析S,将其中的字符判断是啥,然后进行相应的判断。

但是能发现,当字符是A时,x+y= 2x+y+y =2(x+y);
当字符是B时, x+y=x+2
y+x=2(x+y);
所以,无论字符是A还是B,结果都一样,因此只需要判断S有多长,然后乘以2即可。

class Solution{   	public int calculate(String s){   		int x = 1;		int y = 0;		for(int i = 0;i < s.length();i++){   			if(s.charAt(i) == 'A'){   				x = 2*x+y;			}			if(s.charAt(i) == 'B'){   				y = 2*y+x;				}		}		return x+y;	}}
int calculate(char* s[],sSize){   	int length = sizeof(data) /sizeof(s[0]);	return 1<
你可能感兴趣的文章
mysql - 视图
查看>>
MySQL - 解读MySQL事务与锁机制
查看>>
MTTR、MTBF、MTTF的大白话理解
查看>>
mt_rand
查看>>
mysql -存储过程
查看>>
mysql /*! 50100 ... */ 条件编译
查看>>
mudbox卸载/完美解决安装失败/如何彻底卸载清除干净mudbox各种残留注册表和文件的方法...
查看>>
mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
查看>>
mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
查看>>
mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
查看>>
MySQL 8.0 恢复孤立文件每表ibd文件
查看>>
MySQL 8.0开始Group by不再排序
查看>>
mysql ansi nulls_SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思
查看>>
multi swiper bug solution
查看>>
MySQL Binlog 日志监听与 Spring 集成实战
查看>>
MySQL binlog三种模式
查看>>
multi-angle cosine and sines
查看>>
Mysql Can't connect to MySQL server
查看>>
mysql case when 乱码_Mysql CASE WHEN 用法
查看>>
Multicast1
查看>>