[用Golang刷LeetCode之 5] 500. Keyboard Row

miltonsun · · 945 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

题目

问题链接:https://leetcode.com/problems/keyboard-row/#/description
Given a List of words, return the words that can be typed using letters of alphabet on only one row’s of American keyboard like the image below.



Example 1:
Input: ["Hello", "Alaska", "Dad", "Peace"]Output: ["Alaska", "Dad"]

Note:
You may use one character in the keyboard more than once.
You may assume the input string will only contain letters of alphabet.

思路

  1. 用Map存储字母到所在行的映射。
  2. 变量words,对每一个单词,先做小写字母转换存入word,再对word的每个字母进行遍历。用flag标记是否是第一个字母,用row存储第一个字母所在的行,对后续的字母,判断其所在行是否等于row,若不是,直接跳出内层循环继续判断下一个单词。考虑到数组需要预先设置长度,而数组长度未知,所以判断整个单词完毕后将其县存入List,最后再把List的元素存入结果数组。

代码

keyboardRow.go

package _500_Keyboard_Row

import (
    "fmt"
    "strings"
)

var alphabetMap map[string]int

func init() {
    alphabetMap = make(map[string]int)
    row1 := []string{"q", "w", "e", "r", "t", "y", "u", "i", "o", "p"}
    row2 := []string{"a", "s", "d", "f", "g", "h", "j", "k", "l"}
    for _, v := range row1 {
        alphabetMap[v] = 1
    }
    for _, v := range row2 {
        alphabetMap[v] = 2
    }
}
func findWord(word string) (ret bool) {
    word = strings.ToLower(word)
    var allRow int
    allRow = alphabetMap[word[:1]]
    length := len(word)
    for i := 1; i < length; i++ {
        row := alphabetMap[word[i:i+1]]

        if allRow != row {
            return false
        }
    }

    return true
}

func FindWords(words []string) []string {
    var ret []string

    for _, v := range words {
        ok := findWord(v)
        if ok {
            ret = append(ret, v)
        }
    }
    fmt.Printf("ret:%+v\n", ret)
    return ret
}

测试

keyboardRow_test.go

package _500_Keyboard_Row

import "testing"

func TestFindWords(t *testing.T) {

    words := []string{
        "Hello", "Alaska", "Dad", "Peace"}
    ret := FindWords(words)

    wanted := map[string]int{
        "Alaska": 1,
        "Dad": 2,
    }

    for _, v := range ret {
        _, ok := wanted[v]

        if !ok {
            t.Errorf("fail, not want but have %+v\n", v)
            return
        }
    }

    t.Logf("pass")
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:miltonsun

查看原文:[用Golang刷LeetCode之 5] 500. Keyboard Row

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

945 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传