[英]Given an input string of random letters find letters that make up numbers in Java
我正在尋找一個程序,其中給我一個字符串,其中包含來自幾個連接單詞的混亂字母。 每個單詞都是從零到九的數字。 每個數字可能多次出現在字符串中。 我需要編寫一個程序來返回與字符串中的字母相對應的整數。
例如:
輸入:reuonnoinfe output:149
解釋:給定的字符串有 1、4 和 9
到目前為止我嘗試過的是:
public static int strConv(String str) {
HashMap<Character, Integer> charCount = new HashMap<>();
for (char c : s.toCharArray()) {
Integer count = charCount.get(c);
if (count == null) count = 0;
map.put(c, ++count);
}
}
注意:如果多個相同數字有足夠的字符,我應該簡單地再次打印相同的數字(即輸入:ooonneeto 將是 112)
我是 java 的新手,所以不確定如何繼續。 我正在將我看到的所有字符添加到 map。 不確定下一步會是什么? 如何檢查 map 中的字符是否與 0 到 9 之間的任何數字相關?
OP提供了這個問題。
我得到一個字符串,其中包含來自幾個連接單詞的混亂字母。 每個單詞都是從零到九的數字。 每個(單詞)數字可能在字符串中多次出現。 我需要編寫一個程序來返回與字符串中的字母相對應的整數。
看看這個問題是從哪里來的會很有趣。 解決起來比乍一看要復雜得多。
根據問題的文本和 OP 的進一步評論,我們還可以假設以下內容:
輸入保證是正確的或可解析的。
output 將是 integer。
output 的數字將始終按升序排列。 換句話說,是 134,而不是 143 或 341。
根據我之前的評論,我想出了一個簡單的算法來解決這個問題。 它不優雅,但很簡單。
String
數組來保存數字單詞。這是一種方法。
public String[] createWordList() {
String[] numberWords = new String[10];
numberWords[0] = "zero";
numberWords[1] = "one";
numberWords[2] = "two";
numberWords[3] = "three";
numberWords[4] = "four";
numberWords[5] = "five";
numberWords[6] = "six";
numberWords[7] = "seven";
numberWords[8] = "eight";
numberWords[9] = "nine";
return numberWords;
}
String
進行排序。這是執行此操作的 3 行方法。
public String sort(String input) {
char[] digits = input.toCharArray();
Arrays.sort(digits);
return new String(digits);
}
這是一種方法來做到這一點。
public int findNumber(String[] numberWords, String input) {
input = sort(input);
int length = input.length();
double minPower = Math.floor(length / 5d);
double maxPower = Math.ceil(length / 3d);
int minimum = (int) Math.pow(10d, minPower);
int maximum = (int) Math.pow(10d, maxPower);
for (int index = minimum; index < maximum; index++) {
String test = createNumberString(numberWords,
index);
test = sort(test);
if (test.equals(input)) {
return index;
}
}
return -1;
}
現在,剩下的就是編寫createNumberString
方法了。
public String createNumberString(String[] numberWords,
int index) {
String output = "";
while (index > 0) {
int digit = index % 10;
output = numberWords[digit] + output;
index /= 10;
}
return output;
}
當我將這些方法放在一起並進行一些測試時,我得到了以下結果。
reuonnoinfe --> 149
owonneeto --> 112
seveneightninetwothreefive --> 235789
還有一種遞歸算法,它會查看輸入字符串並一次嘗試一個數字單詞,直到輸入中的所有字符都被使用。
由於這個遞歸算法涉及回溯,我沒有概述它。 我把它作為練習留給一些比我更高級的 Java 開發人員。
希望這有用。 這個問題對於一個 Java 初學者來說有點復雜。
同意吉爾伯特的觀點,這個問題比看起來更復雜。 任何人從頭開始解決這個問題都需要幾個小時。 此外,還有一些極端情況可能無法通過測試。 下面是我在 C# 中寫的解決方案。 Java 解決方案應該非常相似。 要理解它,需要深入解析混亂的字母、嵌套循環、if 和 do while 條件。 以下是我解決此問題的步驟。 我相信有更多的時間,它可以做得更好。
下面是用 Main 方法編寫的帶有一些測試的完整代碼。
class NumeralProgram
{
static readonly string[] numerals = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
static string FindNumbers(string input, string[] arrnumerals)
{
List<int> numbers = new List<int>();
do
{
string startInput = input;
foreach (string numeral in arrnumerals)
{
bool numeralFound = false;
string storedInput = input;
foreach (char cn in numeral)
{
int count = input.Count(c => c == cn); // find char for numeral in input string
if (count > 0)
{
numeralFound = true;
int index = input.IndexOf(cn);
input = input.Remove(index, 1); // remove char for the found numeral
}
else
{
numeralFound = false;
input = storedInput; // roll back to previous input
break;
}
}
if (numeralFound)
{
int number = Array.IndexOf(arrnumerals, numeral);
// Console.WriteLine(number); // to view individual number during test
numbers.Add(number);
}
}
if (startInput == input) // stop when chars of numerals are not found
break;
} while (input.Length > 0);
numbers.Sort();
string output = String.Join("", numbers);
return output;
}
static void Main()
{
string input, output;
input = "reuonnoinfe";
output = FindNumbers(input, numerals);
Console.WriteLine(output);
input = "nzerinextneiootnrnoeneeeeuoeoheetehounzoiuetrhfefeezuivirfwieotgoottfnrnneghetserhrwsgesfherhtiitrerevreernhveofiouver";
output = FindNumbers(input, numerals);
Console.WriteLine(output);
input = "tveiifogvweesotwnetnvfeheiotwo";
output = FindNumbers(input, numerals);
Console.WriteLine(output);
input = "ugstrheone";
output = FindNumbers(input, numerals);
Console.WriteLine(output);
input = "seoeisowufxrzohgiettrven";
output = FindNumbers(input, numerals);
Console.WriteLine(output);
}
}
希望這可以幫助!
Python3 版本的 Neal Pandey C# 代碼。
def find_numbers(input):
number_list = [ "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" ]
numbers = []
while len(input) > 0:
startInput = input
for numeral in number_list:
storedInput = input
numeralFound = False
for cn in numeral:
count = input.count(cn)
if count > 0:
numeralFound = True
index = input.index(cn)
if len(input) > index:
input = input[:index:] + input[index+1::]
else:
numeralFound = False
input = storedInput
break
if numeralFound :
number = number_list.index(numeral)
numbers.append(str(number))
if startInput == input:
break
numbers.sort()
output = "".join(numbers)
return output
input = "reuonnoinfe"
output = find_numbers(input)
print(output)
input = "nzerinextneiootnrnoeneeeeuoeoheetehounzoiuetrhfefeezuivirfwieotgoottfnrnneghetserhrwsgesfherhtiitrerevreernhveofiouver"
output = find_numbers(input)
print(output)
input = "tveiifogvweesotwnetnvfeheiotwo"
output = find_numbers(input)
print(output)
input = "ugstrheone"
output = find_numbers(input)
print(output)
input = "seoeisowufxrzohgiettrven"
output = find_numbers(input)
print(output)
Output
reuonnoinfe ==> 149
nzerinextneiootnrnoeneeeeuoeoheetehounzoiuetrhfefeezuivirfwieotgoottfnrnneghetserhrwsgesfherhtiitrerevreernhveofiouver ==> 0001112233333444455677888999
tveiifogvweesotwnetnvfeheiotwo ==> 12225578
ugstrheone ==> 1
seoeisowufxrzohgiettrven ==> 01236
package test;
public class B {
public static void main(String[] args) {
String a = "otwthreeoneotwthrezeroeofnievoetwthreeonotwthreeoneotwthrezeroeoneotwthreeotwthreeoneotwthrezeroeoneotwthreeoneonee";
String[] words = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
String finalString = "";
for (int i = 0; i < words.length; i++) {
String w = words[i];
while (true) {
if (hasWord(w, a)) {
a = removeWord(w, a);
finalString += i;
} else {
break;
}
}
}
System.out.println(finalString);
}
private static boolean hasWord(String word, String input) {
for (char w : word.toCharArray()) {
if (input.indexOf(w) != -1) {
input = input.replaceFirst(w + "", "");
} else
return false;
}
return true;
}
private static String removeWord(String word, String input) {
for (char c : word.toCharArray()) {
input = input.replaceFirst(c + "", "");
}
return input;
}
}
String s = "twosixfourzerothreezeronineonetwothreefourfivesixseveneightninefive";
String[] str = { "zero","one","two","three","four","five","six","seven","eight","nine"};
// z o w h u v x s g
String result = "";
String d="";
char resultc = 0;
String nresult = "";
char[] sc = s.toCharArray();
int counter = 0;
int slength = s.length();
do {
try {
if(s.contains("z")) {
s=s.replaceFirst(Character.toString('z'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('e'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('r'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('o'), "");
counter=counter+1;
nresult = nresult+0;
System.out.println("SOriginal: "+s);
System.out.println("nResult: "+nresult);
}else if(s.contains("w")) {
s=s.replaceFirst(Character.toString('t'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('w'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('o'), "");
counter=counter+1;
nresult = nresult+2;
System.out.println("SOriginal: "+s);
System.out.println("nResult: "+nresult);
}else if(s.contains("u")) {
s=s.replaceFirst(Character.toString('f'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('o'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('u'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('r'), "");
counter=counter+1;
nresult = nresult+4;
System.out.println("SOriginal: "+s);
System.out.println("nResult: "+nresult);
}else if(s.contains("x")) {
s=s.replaceFirst(Character.toString('s'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('i'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('x'), "");
counter=counter+1;
nresult = nresult+6;
System.out.println("SOriginal: "+s);
System.out.println("nResult: "+nresult);
}else if(s.contains("g")) {
s=s.replaceFirst(Character.toString('e'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('i'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('g'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('h'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('t'), "");
counter=counter+1;
nresult = nresult+8;
System.out.println("SOriginal: "+s);
System.out.println("nResult: "+nresult);
}else if(s.contains("h")) {
s=s.replaceFirst(Character.toString('t'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('h'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('r'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('e'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('e'), "");
counter=counter+1;
nresult = nresult+3;
System.out.println("SOriginal: "+s);
System.out.println("nResult: "+nresult);
}else if(s.contains("o") && s.contains("n") && s.contains("e")) {
s=s.replaceFirst(Character.toString('o'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('n'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('e'), "");
counter=counter+1;
nresult = nresult+1;
System.out.println("SOriginal: "+s);
System.out.println("nResult: "+nresult);
}else if(s.contains("f") && s.contains("i") && s.contains("v") && s.contains("e")) {
s=s.replaceFirst(Character.toString('f'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('i'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('v'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('e'), "");
counter=counter+1;
nresult = nresult+5;
System.out.println("SOriginal: "+s);
System.out.println("nResult: "+nresult);
}else if(s.contains("s") && s.contains("e") && s.contains("v") && s.contains("e") && s.contains("n")) {
s=s.replaceFirst(Character.toString('s'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('e'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('v'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('e'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('n'), "");
counter=counter+1;
nresult = nresult+7;
System.out.println("SOriginal: "+s);
System.out.println("nResult: "+nresult);
}else if(s.contains("n") && s.contains("i") && s.contains("n") && s.contains("e")) {
s=s.replaceFirst(Character.toString('n'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('i'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('n'), "");
counter=counter+1;
s=s.replaceFirst(Character.toString('e'), "");
counter=counter+1;
nresult = nresult+9;
System.out.println("SOriginal: "+s);
System.out.println("nResult: "+nresult);
}else {
break;
}
}catch(Exception e) {
System.out.println("Invalid String "+e.getMessage());
}
}while(!(counter==slength));
System.out.println("Result: "+nresult);
if(s.length()!=0) {
System.out.println("Invalid String");
}else {
char[] st = nresult.toCharArray();
Arrays.sort(st);
System.out.println(st);
}
import java.util.*;
public class DigitsFromString {
public static LinkedHashMap<String, Integer> evenMapping;
public static LinkedHashMap<String, Integer> oddMapping;
public static LinkedHashMap<Integer, String> in;
public static LinkedHashMap<String, Integer> counter = new LinkedHashMap<>();
public static void init() {
//unique characters in even number
evenMapping = new LinkedHashMap<>();
evenMapping.put("z", 0);
evenMapping.put("w", 2);
evenMapping.put("u", 4);
evenMapping.put("x", 6);
evenMapping.put("g", 8);
//unique characters in odd number after even unique characters are removed
oddMapping = new LinkedHashMap<>();
oddMapping.put("o", 1);
oddMapping.put("t", 3);
oddMapping.put("f", 5);
oddMapping.put("s", 7);
//digits in words
in = new LinkedHashMap<>();
in.put(0, "zero");
in.put(1, "one");
in.put(2, "two");
in.put(3, "three");
in.put(4, "four");
in.put(5, "five");
in.put(6, "six");
in.put(7, "seven");
in.put(8, "eight");
in.put(9, "nine");
}
public static String sort(String input) {
char[] digits = input.toCharArray();
Arrays.sort(digits);
return new String(digits);
}
public static void main(String[] args) {
DigitsFromString permutations = new DigitsFromString();
List<String> inputs = new ArrayList<>();
inputs.add("reuonnoinfe");
inputs.add("eightfourone");
inputs.add("tveiifogvweesotwnetnvfeheiotwo");
inputs.add("seoeisowufxrzohgiettrventhgieghteitegih");
inputs.add("nzerinextneiootnrnoeneeeeuoeoheetehounzoiuetrhfefeezuivirfwieotgoottfnrnneghetserhrwsgesfherhtiitrerevreernhveofiouvernzerinextneiootnrnoeneeeeuoeoheetehounzoiuetrhfefeezuivirfwieotgoottfnrnneghetserhrwsgesfherhtiitrerevreernhveofiouver");
even:
for (String input : inputs) {
counter = new LinkedHashMap<>();
char[] digits = input.toCharArray();
Arrays.sort(digits);
init();
for (int i = 0; i < digits.length; i++) {
if (counter.get(Character.toString(digits[i])) != null) {
counter.put(Character.toString(digits[i]), counter.get(Character.toString(digits[i])) + 1);
} else {
counter.put(Character.toString(digits[i]), 1);
}
}
String res = "";
for (Map.Entry<String, Integer> map : evenMapping.entrySet()) {
if (counter.get(map.getKey()) != null) {
int cnt = counter.get(map.getKey());
if (cnt != 0) {
String digitStr = in.get(map.getValue());
char[] tmp = digitStr.toCharArray();
for (int i = 0; i < cnt; i++) {
for (int k = 0; k < tmp.length; k++) {
if (counter.get(Character.toString(tmp[k])) == null) {
System.out.println("Invalid String");
continue even;
}
}
res = res + map.getValue();
for (int j = 0; j < tmp.length; j++) {
if (counter.get(Character.toString(tmp[j])) != null) {
counter.put(Character.toString(tmp[j]), counter.get(Character.toString(tmp[j])) - 1);
}
}
}
}
}
}
for (Map.Entry<String, Integer> map : oddMapping.entrySet()) {
if (counter.get(map.getKey()) != null) {
int cnt = counter.get(map.getKey());
if (cnt != 0) {
String digitStr = in.get(map.getValue());
char[] tmp = digitStr.toCharArray();
for (int i = 0; i < cnt; i++) {
for (int k = 0; k < tmp.length; k++) {
if (counter.get(Character.toString(tmp[k])) == null) {
System.out.println("Invalid String");
continue even;
}
}
res = res + map.getValue();
for (int j = 0; j < tmp.length; j++) {
if (counter.get(Character.toString(tmp[j])) != null) {
counter.put(Character.toString(tmp[j]), counter.get(Character.toString(tmp[j])) - 1);
}
}
}
}
}
}
//splcase -- 9
if (counter.get("i") != null) {
int cnt = counter.get("i");
if (cnt != 0) {
for (int i = 0; i < cnt; i++) {
res = res + "9";
}
}
}
res = sort(res);
System.out.println(res);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.