【问题标题】:Shifting arrays without using loops [closed]在不使用循环的情况下移动数组[关闭]
【发布时间】:2013-05-19 14:52:48
【问题描述】:

有人要求我使用递归将两个字符串等同起来。绝对不允许循环。我的想法是逐个元素检查,随着时间的推移缩小字符串,但我不知道如何实现它。一旦我检查了数组的元素,我想删除它们,然后从数组中创建一个新字符串,其中第二个元素现在是第一个,依此类推。

如何做到这一点?

【问题讨论】:

  • 可以使用函数递归。
  • 递归包含定义两件事:基本情况(例如,如果任一字符串是 "",我们立即返回)和递归条件(例如,当我们称自己为,证明我们最终达到了基本情况)。然后只需添加逻辑以返回真/假。
  • 如果你需要递归,你应该尝试递归

标签: java arrays recursion null shift


【解决方案1】:

很常见的面试题,逻辑是这样的:

isMatching(str1, str2, index):

  #check if they have same length, else return false at 1st call
  if(len(str1) != len(str2)) 
    return false                     #<-- termination step

  #if index crossed the length, that means all char in strings are over
  #we have already established that they have same length
  if(index > len(str1)) 
    return true                      #<-- termination step

  #compare char by char
  if(str1[index] == str2[index])
    isMatching(str1, str2, index+1)  #<-- propagation step
  else
    return false                     #<-- termination step

此递归从索引 1 开始,假设是基于 1 的字符串索引。以上只是伪代码。

您会看到递归一直调用一个函数,直到遇到终止步骤,否则它将继续调用相同的函数并使用新的索引值进行比较。所以,

  1. 查看长度是否相同,否则返回 false。故事结束。

  2. 查看索引是否超过了其中一个字符串的长度。因为我们已经确保它们必须具有相同的长度。交叉索引是指每个索引处的所有字符在两个字符串中都是一对一匹配的。 (见第 3 步)。

  3. 比较指示索引处的字符。如果匹配,继续..再次调用该函数,这次要求比较下一个索引

  4. 如果索引不匹配,我们有一个不匹配,终止进程。字符串不匹配,返回false。

【讨论】:

  • +1 - 很好的答案 + 很好的解释!
【解决方案2】:
int compareStrings(String s1,String s2,int curIndex)
{

    if(s1.length()==0 && s2.length()==0) return 0; // equal empty strings
    if(s1.length()==0 && s2.length()>0) return -1; // s1 is empty, s1<s2
    if(s1.length()>0 && s2.length()==0) return 1; // s2 is empty, s1>s2

    if(s1.charAt(curIndex)<s2.charAt(curIndex)) return -1;

    if(s1.charAt(curIndex)>s2.charAt(curIndex)) return 1;

    if(curIndex+1<Math.min(s1.length(),s2.length()))
    {
        return compareStrings(s1, s2, curIndex+1);
    }
    else
    {
        if(s1.length()==s2.length()) return 0;
        else if(s1.length()<s2.length()) return -1;
        else return 1;
    }


}

函数 compareStrings 如果字符串相等则返回 0,如果 s1 按字典顺序小于 s2 则返回 -1,如果 s1 >s2 则返回 1。一些测试输出:

    System.out.println(compareStrings("test","test",0)); // 0
    System.out.println(compareStrings("test","tesw",0)); // -1
    System.out.println(compareStrings("tesw","test",0)); // 1
    System.out.println(compareStrings("tesw","tes",0)); //1
    System.out.println(compareStrings("tes","tesw",0)); //-1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-12
    • 2016-05-28
    • 1970-01-01
    • 2018-06-02
    • 2015-03-06
    • 2011-04-26
    • 2020-02-26
    • 1970-01-01
    相关资源
    最近更新 更多