LeetCode 500 Keyboard Row
C代码版。
题目大意:给一串单词,找出所有字母全在美式键盘一行中的那些单词。
例如:单词“Alaska”,其所有字母:“A”,"a","l","s","k",全在美式键盘中的第3行,满足条件;
而单词“Hello”,其所有字母:“H”,“e”,"l","o",“H”和“l”在第3行,而“e”和“o”在第2行,所以不满足条件。
题目很简单,没什么难度;如果用C的话,主要是考指针以及二级指针的用法,另外值得注意的一点是,需注意字符的大小写。
C版本代码如下,仅供参考(为了在LeetCode上提交方便,没有使用全局变量;提交时,只需提交“findCharInKeyBoardRow()”和“findWords()”这两个函数即可)。
#define LOCAL
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int findCharInKeyBoardRow(char c, char** keyBoardStr, int KBDNUM){
c = tolower(c);
int i,j;
for(i=0;i<KBDNUM;i++){
for(j=0;j<strlen(keyBoardStr[i]);j++){
if(c==keyBoardStr[i][j])
return i;
}
}
return -1;
}
char** findWords(char** words, int wordsSize, int* returnSize){
int MAXSTR,MAXLEN,KBDNUM;
MAXSTR=100;
MAXLEN=100;
KBDNUM=3;
char* keyBoardStr[]={"qwertyuiop","asdfghjkl","zxcvbnm"};
int i,j,rowPos,flag;
*returnSize=0;
char** inRows=(char**)malloc(wordsSize*sizeof(char*));
if(inRows==NULL)
return NULL;
for(i=0;i<wordsSize;i++)
inRows[i]=(char*)malloc(MAXLEN*sizeof(char));
for(i=0;i<wordsSize;i++){
rowPos=findCharInKeyBoardRow(words[i][0],keyBoardStr,KBDNUM);
flag=1;
for(j=1;j<strlen(words[i]);j++){
if(rowPos!=findCharInKeyBoardRow(words[i][j],keyBoardStr,KBDNUM)){
flag=0;
break;
}
}
if(flag){
strcpy(inRows[*returnSize],words[i]);
(*returnSize)++;
}
}
return inRows;
}
int main(){
#ifdef LOCAL
freopen("500_input.txt","r",stdin);
freopen("500_output.txt","w",stdout);
#endif
int MAXSTR,MAXLEN,KBDNUM;
MAXSTR=100;
MAXLEN=100;
KBDNUM=3;
int i,wordsSize,returnSize;
// initiate.
wordsSize=0;
char** words=(char**)malloc(MAXSTR*sizeof(char*));
char ** INROWS=NULL;
if(words==NULL)
return 1;
for(i=0;i<MAXSTR;i++)
words[i]=(char*)malloc(MAXLEN*sizeof(char));
// fill string.
while(scanf("%s",words[wordsSize])==1)
wordsSize++;
// call function findWords.
INROWS=findWords(words, wordsSize, &returnSize);
for(i=0;i<returnSize;i++)
printf("%s\n",INROWS[i]);
// free space.
for(i=0;i<MAXSTR;i++)
free(words[i]);
free(words);
return 0;
}