题目一:力扣1920.基于排列构建数组 给你一个从 0 开始的排列 nums (下标也从 0 开始)。请你构建一个同样长度的数组 ans ,其中,对于每个 i ( 0 = i nums.length ),都满足 ans[i] = nums[
题目一:力扣1920. 基于排列构建数组
给你一个 从 0 开始的排列 nums
(下标也从 0 开始)。请你构建一个 同样长度 的数组 ans
,其中,对于每个 i
(0 <= i < nums.length
),都满足 ans[i] = nums[nums[i]]
。返回构建好的数组 ans
。
从 0 开始的排列 nums
是一个由 0
到 nums.length - 1
(0
和 nums.length - 1
也包含在内)的不同整数组成的数组
例子1:
输入:nums = [0,2,1,5,3,4]
输出:[0,1,2,4,5,3]
解释:数组 ans 构建如下:
ans = [nums[nums[0]], nums[nums[1]], nums[nums[2]], nums[nums[3]], nums[nums[4]], nums[nums[5]]]
= [nums[0], nums[2], nums[1], nums[5], nums[3], nums[4]]
= [0,1,2,4,5,3]
解题:
int* buildArray(int* nums, int numsSize, int* returnSize)
{
int* ret = malloc(sizeof(int)*numsSize);//先创建一个要返回的数组
memset(ret,0,sizeof(int)*numsSize);
for(int i = 0;i<numsSize;i++)//循环遍历一次
{
ret[i] = nums[nums[i]];//按规则为ret赋值
}
*returnSize = numsSize;
return ret;
}
题目二:力扣58. 最后一个单词的长度
给你一个字符串 s
,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。
单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。
输入:s = "Hello World"
输出:5
解释:最后一个单词是“World”,长度为5。
解题:
int lengthOfLastWord(char * s)
{
if(strlen(s)==1)
return 1;//排除只有一个字符的干扰
//思路为从这个字符串的最后开始计算
int len = strlen(s);
int count = 0;
for(int i = len-1;i>=0;i--)
{
if(s[i]!=' ')
count++;//如果这个字符串里面的字符不是空格那么这就是一个单词的字母
if(s[i]==' '&&count!=0)
break;//当我们的s[i]代表的是一个空格了,并且count不为0代表这是最后一个单词结束了
}
return count;
}
这道题我一开始想的是运用双指针,一个指针在前面一个指针在后面,但是这种写法就很难判断最后一个单词的存在。如果最后一个单词的后面不是空格而是\0那么使用双指针是可以的,但是在判断例子里面恰好就有最后一个单词的后面是两个空格的情况,这就让我难以处理,并且使用双指针我们至少都要遍历一遍数组,而若是从数组的最后开始,那么就不用遍历完数组
题目三:力扣171 Excel 表列序号
给你一个字符串 columnTitle
,表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。
例如:
A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28
...
解题:
int titleToNumber(char * columnTitle)
{
int count = 0;//这是我们储存转化的十进制数的变量
//遍历一遍数组
for(int i = 0;i<strlen(columnTitle);i++)
{
count=count*26+(columnTitle[i]-'A'+1);//这里使用的就是一种映射的方法
//这个算式也使适用于将字符串里面的字符数字转化为整型数字
}
return count;
}
题目4:168. Excel表列名称
给你一个整数 columnNumber
,返回它在 Excel 表中相对应的列名称。
例如:
A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28
...
解题:
void reverse(char* arr,int size)
{
int start = 0;
int end = size - 1;
while(start<end)
{
char tmp = arr[start];
arr[start] = arr[end];
arr[end] = tmp;
start++;
end--;
}
}
char* convertToTitle(int columnNumber)
{
//这道题的本质也就是将10进制的数转化为26进制
//使用的是辗转相除法
//这也是将十进制的数转化为其它进制数的一种方式
char* ret = (char*)malloc(sizeof(char)*8);//创建一个我们1要返回的数组
int j = 0;//这个是我们用来储存时控制ret的下标的
int reminder = 0;//这个column模上26之后的数
while(columnNumber)//
{
reminder = columnNumber%26;
if(reminder==0)
{
//代表此时的reminder为26
//我们必须手动修改
reminder = 26;
columnNumber-=26;//这一步是为了让循环得以继续,
}
ret[j++] = reminder - 1+'A';//这里就是赋值了我们知道reminder的值只可能是0到25那么这里的0也就是A了
//所以为了映射正确我们要减去一个1
columnNumber/=26;
}
//在循环完毕的时候我们要知道我们放入到ret里面的字符应该在逆置一下才行
//因为我们每一次去取出的都是最后一个数字但是却放在了数组的首位
ret[j] = '\0';//为了防止答案出错我们必须手动加上\0
reverse(ret,j);//这个函数就用于倒置数组
return ret;
}