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

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

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数组的下标,将数组的元素初始化为对应字母所在的行数;然后每次判断字符串时,先判断第一个字母所在的行数,再判断后面字母所在的行数是否等于第一个字母所在的行数,最后利用遍历的变量与字符串的长度是否相等判断这个字符串是否符合题目要求;

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的时候是从低位开始取余数,放入数组中就变成了高位,所以最后需要逆置字符串;

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;
        }
        //负数的情况,在末尾加上符号,然后加上'\0'
        if (flag)
        {
            ret[pos++] = '-';
        }
        ret[pos] = '\0';
        //逆置字符串
        //因为num是从低位开始遍历,而遍历num时得到的七进制位数是放在了字符串的高位
        int left = 0, right = pos - 1;
        while (left < right)
        {
            char tmp = ret[left];
            ret[left++] = ret[right];
            ret[right--] = tmp;
        }
        return ret;
    }
目录
相关文章
|
算法
【Leetcode -405.数字转换为十六进制数 - 409.最长回文串】
【Leetcode -405.数字转换为十六进制数 - 409.最长回文串】
41 0
|
6月前
|
存储
leetcode:504. 七进制数
leetcode:504. 七进制数
35 0
|
存储 算法 索引
【每日挠头算法题】LeetCode 1337. 矩阵中战斗力最弱的 K 行 —— 二分 + 排序 / 堆
【每日挠头算法题】LeetCode 1337. 矩阵中战斗力最弱的 K 行 —— 二分 + 排序 / 堆
121 0
【每日挠头算法题】LeetCode 1337. 矩阵中战斗力最弱的 K 行 —— 二分 + 排序 / 堆
|
索引
LeetCode 1337. 矩阵中战斗力最弱的 K 行
给你一个大小为 m * n 的矩阵 mat,矩阵由若干军人和平民组成,分别用 1 和 0 表示。
138 0
|
索引
【day04】力扣(LeetCode)每日一刷[1306. 跳跃游戏 III ][703. 数据流中的第 K 大元素 ][1337. 矩阵中战斗力最弱的 K 行]
了解学习 跳跃游戏 III , 数据流中的第 K 大元素 , 矩阵中战斗力最弱的 K 行。
209 0
【day04】力扣(LeetCode)每日一刷[1306. 跳跃游戏 III ][703. 数据流中的第 K 大元素 ][1337. 矩阵中战斗力最弱的 K 行]
【刷穿 LeetCode】405. 数字转换为十六进制数 :「进制转换」&「分组换算」
【刷穿 LeetCode】405. 数字转换为十六进制数 :「进制转换」&「分组换算」
|
机器学习/深度学习
【刷穿 LeetCode】470. 用 Rand7() 实现 Rand10() : k 进制诸位生成 + 拒绝采样
【刷穿 LeetCode】470. 用 Rand7() 实现 Rand10() : k 进制诸位生成 + 拒绝采样
|
算法 Java C#
【算法千题案例】每日LeetCode打卡——79.键盘行
📢前言 🌲原题样例:键盘行 🌻C#方法:排序遍历 🌻Java 方法:计数 💬总结
【算法千题案例】每日LeetCode打卡——79.键盘行
|
算法 C++
​LeetCode刷题实战405:数字转换为十六进制数
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
178 0