优化的代码2在两个字符串中得到不常见的字符(遵循火焰游戏规则)

时间:2017-11-08 06:07:41

标签: java android optimization

我的采访者让我为FLAMES Game

编写优化代码

游戏规则如下。

1 - 取两个名字(即 - 'naveen'和'tejveer')

2 - 比较这两个字符串以获得非常见的字符,如

NA的 VEE 名词

t e j ve

粗体字符在两者中都很常见,应该删除

注意 - 如果在string1中有两个字符出现,而在另一个字符串中出现相同的字符3次,那么有两个字符被视为普通字符,一个字符被视为不常见

3 - 删除常用字符(本例'e','v','e'中的三个常用字符)

4 - 获取剩下的字符数(删除常用字符后剩下7个字符,这些字符是 - n,a,n,t,e,j,r。)

我写了这两个函数。 //这是正常的功能(没有两个优化)

private static void flames2(String name1 , String name2){
    int n1Length = name1.length();
    int n2Length = name2.length();
    StringBuilder target;
    StringBuilder player;
    int oCounter;
    int iCounter;
    if(n1Length > n2Length){
        player = new StringBuilder(name1);  
        target = new StringBuilder(name2);

        oCounter = n1Length;
        iCounter = n2Length;
    }else{
        player = new StringBuilder(name2);  
        target = new StringBuilder(name1);  
        oCounter = n2Length;
        iCounter = n1Length;
    }

    int matches = 0;

    for(int i = 0; i< oCounter ; i++){
        for(int j = 0;j < iCounter ; j++){
            if(player.charAt(i) ==  target.charAt(j)){
                char chTemp = target.charAt(j);
                target.setCharAt(j , target.charAt(iCounter-1));
                target.setCharAt(iCounter-1 , chTemp);
                iCounter--;
                matches++;
                break;
            }       
        }   
    }
    int unmatchedChars = name1.length()+name2.length()-2*matches;
    System.out.println("result "+unmatchedChars);
}

然后他告诉我通过使用一个for循环来解决这个问题,我尝试了这个稍微优化的功能。

private static void flames3(String name1 , String name2){
    int n1Length = name1.length();
    int n2Length = name2.length();
    StringBuffer target;
    String player;
    int oCounter;

    if(n1Length < n2Length){
        target = new StringBuffer(name2);
        player = name1;
        oCounter = n1Length;

    }else{
        target = new StringBuffer(name1);   
        player = name2;
        oCounter = n2Length;
    }

    int matches = 0;
    for(int i = 0; i< oCounter ; i++){
        int index = target.toString().indexOf(player.charAt(i));
        if(index >= 0){
            target.setCharAt(index,'_');
            matches++;      
        }
    }
    int unmatchedChars = name1.length()+name2.length()-2*matches;
    System.out.println("result "+unmatchedChars);
}

但是在函数flames3中我使用的是String.IndexOf(),它使用for循环来检查字符。

在这些函数中,我只是计算匹配的字符。 所以有一种方法可以编写更多优化的函数。

1 个答案:

答案 0 :(得分:-1)

以下事情可能会以优化的方式正常工作。

 public void flames(String name1, String name2) {

    List<String> list1 = new ArrayList<>();
    List<String> list2 = new ArrayList<>();
    for (int i = 0; i < name1.length(); i++) {
        list1.add(String.valueOf(name1.charAt(i)));
    }
    for (int i = 0; i < name2.length(); i++) {
        list2.add(String.valueOf(name2.charAt(i)));
    }
    List<String> union = new ArrayList<String>(list1);
    union.addAll(list2);
    List<String> intersection = new ArrayList<String>(list1);
    intersection.retainAll(list2);
    union.removeAll(intersection);
    for (String n : union) {
        Log.d("item", n);
    }
}