问题:检查数组arr2是否以相同的顺序包含在arr1中。 arr2可以包含在arr1中的任何位置。
示例:
contains({"1", "2", "3"}, {"1", "2"}) → true
contains({"1", "2", "3"}, {"2", "3"}) → true
contains({"1", "2", "3"}, {"2", "1"}) → false
我的代码适用于所有情况,除非arr2比arr1短,而arr2不在arr1的第0位开始。
这是我的代码:
public boolean contains(String[] arr1, String[] arr2){
if (arr2.length>arr1.length)
{
return false;
}
int x=0;
if(arr2.length==arr1.length)
{
for (int i=0; i<arr1.length; i++)
{
if(arr1[i]==arr2[i])
{
x++;
}
}
if(x==arr1.length)
{
return true;
}
return false;
}
int y=0;
if(arr2.length<arr1.length)
{
for(int i=0; i<arr2.length; i++)
{
if(arr1[i]==arr2[i])
{
y++;
}
}
}
if(y==arr2.length)
{
return true;
}
return false;
}
我宁愿有提示而不是答案本身。非常感谢你!
答案 0 :(得分:1)
您只想提示,所以这里有一个:
在if(arr2.length<arr1.length)
声明中,您只是循环比较arr1[i]
和arr2[i]
。正如你自己所说,这只是比较arr2是否与arr1的开头匹配。
要测试arr2
在稍后位置开始的情况,你必须在arr1 [i + j]和arr2 [i]之间对不同的j进行比较,即你需要另一个 for循环可能&#34;轮班&#34; j在数组起点之间,for i
循环中的for j
循环嵌套。务必在正确的位置将y
重置为零。
答案 1 :(得分:1)
这是您的代码修改为正确的解决方案。你当然可以做得更好。
public boolean contains(String[] arr1, String[] arr2){
if (arr2.length>arr1.length)
{
return false;
}
if(arr2.length==arr1.length)
{
for (int i=0; i<arr1.length; i++)
{
if(!arr1[i].equals(arr2[i]))
{
retrun false;
}
}
return true;
}
int y =0;
if(arr2.length<arr1.length)
{
for(int i=0; i<=(arr1.length-arr2.length); i++)
{
for(int j=0; j<arr2.length;j++){
if(arr1[i+j].equals(arr2[j])){
y++;
}
}
if(y == arr2.length){
return true;
}else {
y = 0;
}
}
return false;
}
答案 2 :(得分:0)
我建议查看String#contains方法实现(特别是在String #indexOf静态方法)。算法看起来与您的问题非常相似。
答案 3 :(得分:0)
在阅读您的解决方案时,我发现有3个部分。
第1部分:如果数组2小于数组1,则数组2不能是数组1的子数组
第2部分:比较2个数组的大小相同时的每个元素。如果所有元素都相同,则数组2是数组1的子数组
第3部分:当数组2的大小小于数组1的大小时,比较2数组的每个元素。 第2部分和第3部分存在问题。它们具有相同的逻辑。如果2个数组具有相同的大小,则第3部分工作正常。实际上,如果两个阵列具有相同的大小,那么第2部分将处理这种情况。所以第2步和第3步基本相同
我会修改第3部分如下:
第3部分(新):如果数组2小于数组1,并且数组2包含在数组1中,则数组1应该有一个子数组,其中该子数组的每个元素等于每个元素数组2
步骤1:将数组2的每个元素与数组1的子数组进行比较。
步骤2:如果所有元素都是等号,则数组2包含在数组1中。如果任何元素不相等,则对数组1的下一个子数组重复步骤1.
注意:如果您熟悉递归,解决方案将更整洁。每当我们重复步骤1时,我们正在解决同一问题,作为一般解决方案的一部分。
以下是递归解决方案。此解决方案不考虑null和空数组。
<!DOCTYPE html>
<html>
<body>
<p>This example calls a function which performs a calculation, and returns the result:</p>
<p id="demo"></p>
<script>
function findSubArray(bigArray, smallArray, startIndexOfSubArray)
{
if((bigArray.length - startIndexOfSubArray) < smallArray.length)
return false;
for(index = 0; index < smallArray.length; index++)
{
if(bigArray[startIndexOfSubArray + index] != smallArray[index]){
return findSubArray(bigArray,
smallArray,
startIndexOfSubArray = startIndexOfSubArray + 1);
}
}
return true;
}
var bigArray = [1,3,3,4,5,6];
var smallArray = [4,5,7];
var isSubArray = findSubArray(bigArray, smallArray, 0);
document.getElementById("demo").innerHTML = isSubArray.toString();
</script>
</body>
</html>