题目描述
九宫格按键输入,输出显示内容。有英文和数字两个模式,默认是数字模式。数字模式直接输出数字,英文模式连续按同一个按键会依次出现这个按键上的字母。如果输入“/”或其他字符,则循环中断。
输入描述
输入范围为数字0~9和字符#、/。输出屏幕显示。例如在数字模式下,输入1234,显示1234;在英文模式下,输入1234,显示,adg。
输出描述
#
用于切换模式,默认是数字模式,执行#
后切换为英文模式。/
表示延迟,例如在英文模式下,输入22/222,显示为bc。- 英文模式下,多次按同一键,例如输入22222,显示为b。
解题思路
这个问题可以通过状态机来解决。我们需要维护当前模式(数字模式或英文模式)以及当前按键的连续按击次数。根据输入字符的不同,我们更新状态并生成相应的输出。
代码实现
Java
import java.util.*;public class NineKeyInput {private static final String[] DIGITS = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};private static final String[] LETTERS = {" ", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};public String processInput(String input) {boolean isNumberMode = true;StringBuilder output = new StringBuilder();int index = 0;while (index < input.length()) {char ch = input.charAt(index);if (ch == '#') {isNumberMode = !isNumberMode;index++;} else if (ch == '/') {index++;} else if (Character.isDigit(ch)) {int digit = ch - '0';if (isNumberMode) {output.append(DIGITS[digit]);index++;} else {int count = 0;while (index < input.length() && input.charAt(index) == ch) {count++;index++;}String letters = LETTERS[digit];output.append(letters.charAt((count - 1) % letters.length()));}} else {index++;}}return output.toString();}public static void main(String[] args) {NineKeyInput processor = new NineKeyInput();System.out.println(processor.processInput("123#222235/56")); // 123adjjm}
}
Python
class NineKeyInput:DIGITS = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]LETTERS = [" ", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]def process_input(self, input_str):is_number_mode = Trueoutput = []index = 0while index < len(input_str):ch = input_str[index]if ch == '#':is_number_mode = not is_number_modeindex += 1elif ch == '/':index += 1elif ch.isdigit():digit = int(ch)if is_number_mode:output.append(self.DIGITS[digit])index += 1else:count = 0while index < len(input_str) and input_str[index] == ch:count += 1index += 1letters = self.LETTERS[digit]output.append(letters[(count - 1) % len(letters)])else:index += 1return ''.join(output)processor = NineKeyInput()
print(processor.process_input("123#222235/56")) # 123adjjm
C++
#include <iostream>
#include <string>
#include <vector>using namespace std;class NineKeyInput {
private:vector<string> DIGITS = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};vector<string> LETTERS = {" ", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};public:string processInput(string input) {bool isNumberMode = true;string output;int index = 0;while (index < input.length()) {char ch = input[index];if (ch == '#') {isNumberMode = !isNumberMode;index++;} else if (ch == '/') {index++;} else if (isdigit(ch)) {int digit = ch - '0';if (isNumberMode) {output += DIGITS[digit];index++;} else {int count = 0;while (index < input.length() && input[index] == ch) {count++;index++;}string letters = LETTERS[digit];output += letters[(count - 1) % letters.length()];}} else {index++;}}return output;}
};int main() {NineKeyInput processor;cout << processor.processInput("123#222235/56") << endl; // 123adjjmreturn 0;
}
JavaScript
class NineKeyInput {constructor() {this.DIGITS = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];this.LETTERS = [" ", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"];}processInput(input) {let isNumberMode = true;let output = '';let index = 0;while (index < input.length) {const ch = input[index];if (ch === '#') {isNumberMode = !isNumberMode;index++;} else if (ch === '/') {index++;} else if (/\d/.test(ch)) {const digit = parseInt(ch);if (isNumberMode) {output += this.DIGITS[digit];index++;} else {let count = 0;while (index < input.length && input[index] === ch) {count++;index++;}const letters = this.LETTERS[digit];output += letters[(count - 1) % letters.length];}} else {index++;}}return output;}
}const processor = new NineKeyInput();
console.log(processor.processInput("123#222235/56")); // 123adjjm
复杂度分析
- 时间复杂度: O(n),其中n是输入字符串的长度。我们需要遍历整个字符串一次来处理每个字符。
- 空间复杂度: O(1),除了输出字符串外,我们只使用了常数空间来存储模式和当前按键的连续按击次数。
总结
我们使用了状态机来处理这个问题,通过维护当前模式和按键的连续按击次数,能够有效地生成相应的输出。这种方法简单直观,适用于处理这种模式切换和按键映射的问题。