簡體   English   中英

給定一個隨機字母的輸入字符串,在 Java 中找到組成數字的字母

[英]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 的進一步評論,我們還可以假設以下內容:

  1. 輸入保證是正確的或可解析的。

  2. output 將是 integer。

  3. output 的數字將始終按升序排列。 換句話說,是 134,而不是 143 或 341。

根據我之前的評論,我想出了一個簡單的算法來解決這個問題。 它不優雅,但很簡單。

  1. 創建一個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;
}
  1. 按字母順序對輸入String進行排序。

這是執行此操作的 3 行方法。

public String sort(String input) {
    char[] digits = input.toCharArray();
    Arrays.sort(digits);
    return new String(digits);
}
  1. 根據輸入字符串中的字母數,計算可能的最小和最大數字。 由於最小的數字字是 3 個字符,最大的數字字是 5 個字符,所以最小和最大 integer 可以這樣計算。

這是一種方法來做到這一點。

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 條件。 以下是我解決此問題的步驟。 我相信有更多的時間,它可以做得更好。

  1. 創建一個數字字符串數組。
  2. 循環遍歷數組中每個數字的每個字符,並找出這些字符是否存在於混亂的輸入字符串中。
  3. 如果找到了一個數字的所有字符 (a) 使用在混雜字符串中找到的字符的索引,從混雜字符串中刪除該數字字符的一個實例。 (b) 在 integer 集合的列表中添加數字。
  4. 重復步驟 #2 和 #3,直到在混亂的字符串中找不到更多數字。
  5. 對找到的數字列表的集合進行排序。
  6. 將 List 轉換為字符串 output。

下面是用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM