【Leetcode -500.键盘行 -504.七进制数】

2024-03-01 09:52:37 浏览数 (2)

Leetcode -500.键盘行

题目:给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。

美式键盘 中: 第一行由字符 “qwertyuiop” 组成。 第二行由字符 “asdfghjkl” 组成。 第三行由字符 “zxcvbnm” 组成。

示例 1: 输入:words = [“Hello”, “Alaska”, “Dad”, “Peace”] 输出:[“Alaska”, “Dad”]

示例 2: 输入:words = [“omk”] 输出:[]

示例 3: 输入:words = [“adsdf”, “sfd”] 输出:[“adsdf”, “sfd”]

思路是创建一个hash数组,以26个字母减去’ A '作为hash数组的下标,将数组的元素初始化为对应字母所在的行数;然后每次判断字符串时,先判断第一个字母所在的行数,再判断后面字母所在的行数是否等于第一个字母所在的行数,最后利用遍历的变量与字符串的长度是否相等判断这个字符串是否符合题目要求;

代码语言:javascript复制
		char** findWords(char** words, int wordsSize, int* returnSize)
		{
		    *returnSize = 0;
		
		    //如果为空字符串,返回空
		    if (!words)
		        return NULL;
		
		    //给定26个字母行数,按照美式键盘的行数给定
		    //例如asdfghjkl,这些字母都在第二行,那就给它们在hash的下标处标记为2,说明为第二行
		    int hash[26] = { 2, 3, 3, 2, 1, 2, 2, 2, 1, 2, 2, 2, 3, 3, 1, 1, 1, 1, 2, 1, 1, 3, 1, 3, 1, 3 };
		    char** ret = (char**)malloc(sizeof(char*) * wordsSize);
		
		    int i, j, len;
		    for (i = 0; i < wordsSize; i  )
		    {
		        //如果该单词长度为0,即为空字符串,继续循环,寻找下一个字符串
		        len = strlen(words[i]);
		        if (len == 0)
		            continue;
		
		        //tolower 小写字母转换为大写
		        //每个字符串第一个字符所在美式键盘的行数,判断一个字母所在的行数
		        //再判断这个字符串后面的字母是否在这一行,若有一个字母不在这一行,就跳出循环,
		        //利用j是否等于len决定是否将这个字符串放入返回数组中,j等于len说明已经遍历完这个字符串,没有break,所有的字母都在这一行
		        int num = hash[toupper(words[i][0]) - 'A'];
		        for (j = 1; j < len; j  )
		        {
		            if (hash[toupper(words[i][j]) - 'A'] != num)
		                break;
		        }
		
		        if (j == len)
		        {
		            ret[(*returnSize)  ] = words[i];
		        }
		    }
		
		    return ret;
		}

Leetcode - 504.七进制数

题目:给定一个整数 num,将其转化为 7 进制,并以字符串形式输出。

示例 1: 输入: num = 100 输出 : “202”

示例 2 : 输入 : num = -7 输出 : “-10”

思路是从num的低位开始遍历,除以7取余就是七进制的一个位数(从低位开始),用flag判断num是否为负数;最后因为遍历num的时候是从低位开始取余数,放入数组中就变成了高位,所以最后需要逆置字符串;

代码语言:javascript复制
		char* convertToBase7(int num)
		{
		    if (num == 0)
		        return "0";
		
		    //负数只需要将负号搬到返回的字符串中,其它按照七进制的转换
		    //若num为负数,flag记为1,然后转换为正数
		    int flag = num < 0;
		    num = abs(num);
		
		    int pos = 0;
		    char* ret = (char*)malloc(sizeof(char) * 32);
		
		    //从num的低位开始遍历,num除以7取余数,即是一个七进制的位数(从低位开始)
		    //注意需要转换成字符串形式输出,所以每个数字都需要加上字符0
		    while (num > 0)
		    {
		        ret[pos  ] = num % 7   '0';
		        num /= 7;
		    }
		
		    //负数的情况,在末尾加上符号,然后加上''
		    if (flag)
		    {
		        ret[pos  ] = '-';
		    }
		    ret[pos] = '';
		
		    //逆置字符串
		    //因为num是从低位开始遍历,而遍历num时得到的七进制位数是放在了字符串的高位
		    int left = 0, right = pos - 1;
		    while (left < right)
		    {
		        char tmp = ret[left];
		        ret[left  ] = ret[right];
		        ret[right--] = tmp;
		    }
		
		    return ret;
		}

0 人点赞