问题描述
小S玩起了多米诺骨牌,他排列了一行骨牌,并可能将某些骨牌向左或向右推倒。随着骨牌连锁反应的进行,一些骨牌可能因为左右两侧受力平衡而保持竖立。现在小S想要知道在所有动作完成后,哪些骨牌保持竖立。
给定一个表示骨牌初始状态的字符串,其中:
“L” 表示该位置的骨牌将向左倒。
“R” 表示该位置的骨牌将向右倒。
“.” 表示该位置的骨牌初始时保持竖立。
模拟整个骨牌倒下的过程,求出最终仍然保持竖立的骨牌的数目和位置。
测试样例
样例1:
输入:num = 14,data = “.L.R…LR…L…”
输出:‘4:3,6,13,14’
样例2:
输入:num = 5,data = “R…”
输出:‘0’
样例3:
输入:num = 1,data = “.”
输出:‘1:1’
解答C
思路
- 从左往右遍历字符串,凡是遇到竖立的骨牌则记录
- 当遇到第一个向左倒且之前不存在向右倒的情况,则清空之前记录的竖立骨牌。因为此牌左边没有向右倒的,所以此牌左边所有的骨牌都会倒下
- 当遇上第一个向右倒的骨牌时,应该寻找下一个向左倒的骨牌。找到两个骨牌中间竖立的骨牌数量必须是奇数才能有中间一块骨牌竖立。因此取其中一个即可
- 当遇上第一个向右倒的骨牌,如果前面有竖立的骨牌应当全部记录
- 当遍历达到最后且上一个骨牌倒向状态是向左,那么剩下的所有骨牌都应当被记录
C代码
PS:代码挺暴力的,没想过更好的实现。请广大网友指正
#include "stdlib.h"
#include <stdio.h>
#include <string.h>
typedef enum _status { none, left = 1, right = 2 } status;
char *solution(int num, char *data) {
// Please write your code here
int offset;
int count;
int i, j;
status lastStatus = none;
int *tmpResult = malloc(sizeof(int) * num);
int *result = malloc(sizeof(int) * num);
char *output = NULL;
i = 0;
j = 0;
count = 0;
offset = 0;
while (offset < num) {
if (data[offset] == '.') {
tmpResult[i] = offset+1;
i++;
} else if (data[offset] == 'L') {
if (lastStatus == none)
i = 0;
else if (lastStatus == right) {
if (i % 2) {
result[count] = tmpResult[i / 2];
count++;
}
i = 0;
}
lastStatus = left;
} else if (data[offset] == 'R') {
j = 0;
while (j < i) {
result[count] = tmpResult[j];
count++;
j++;
}
i = 0;
lastStatus = right;
}
offset++;
}
if (lastStatus == left || lastStatus == none) {
j = 0;
while (j < i) {
result[count] = tmpResult[j];
count++;
j++;
}
}
output = malloc(sizeof(char) * count);
i = 0;
sprintf(output, "%d:", count);
while (i < count) {
sprintf(output + strlen(output), "%d,", result[i]);
i++;
}
output[strlen(output) - 1] = '\0';
free(tmpResult);
free(result);
return output;
}
int main() {
// You can add more test cases here
printf("%d\n", strcmp(solution(14, ".L.R...LR..L.."), "4:3,6,13,14") == 0);
printf("%d\n", strcmp(solution(5, "R...."), "0") == 0);
printf("%d\n", strcmp(solution(1, "."), "1:1") == 0);
return 0;
}
输出结果:
cbk:~/workspace/pg/postgres$ gcc -g test.c -o test
cbk:~/workspace/pg/postgres$ ./test
1
1
1
1328

被折叠的 条评论
为什么被折叠?



