刷题3:给定一个数组 nums,判断 nums 中是否存在三个下标 a,b,c数相加等于targe且a,b,c不相等

简介: 刷题3:给定一个数组 nums,判断 nums 中是否存在三个下标 a,b,c数相加等于targe且a,b,c不相等

题目:

 

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,标 ,a ,b , c 对应数相加等于 targe 找出所有满足条件且不重复的三元组下标


解析:


  在一个list里面找出来三个数字使这三个数字相加等于目标targe,

 

 这里是一个list 我们去循环这里面的元素,我们利用for循环, 第一个取来,然后后剩下的元素分别取循环上一个循环剩下的元素。这样保证了不重复,最后验证下,如果找出来的数字的值满足a+b+c=targe ,且三个数不相等,我们认为查询正确。


那么我们看下python代码是如何实现的


def findthree(nums:list,targe:int):
    if len(nums)<3:
        return False
    result=[]
    for a in range(len(nums)):
        for b in range(len(nums))[a:]:
            for c in range(len(nums))[b:]:
                try:
                    if nums[a]+nums[b]+nums[c]==targe and a!=b and b!=c and a!=c :
                        result.append((a,b,c))
                except:
                    return False
    return result


那么我们看下测试代码


mport  unittest
from findthree import findthree
class TestCae(unittest.TestCase):
    def setUp(self) -> None:
        pass
    def tearDown(self) -> None:
        pass
    def testone(self):
        reslt=findthree([],6)
        self.assertFalse(reslt)
    def testtwo(self):
        reslt = findthree([1], 6)
        self.assertFalse(reslt)
    def testthree(self):
        reslt = findthree([1,'2'], 6)
        self.assertFalse(reslt)
    def testFor(self):
        reslt = findthree([1,'2',"2"], 6)
        self.assertFalse(reslt)
    def testfive(self):
        reslt = findthree([1,2,3], 6)
        self.assertEqual(reslt,[(0,1,2)])
    def testsix(self):
        reslt = findthree([1,2,3,3], 6)
        self.assertEqual(reslt,[(0,1,2),(0,1,3)])
if __name__=="__main__":
    unittest.main()


看下运行结果:


image.png


看下最后代码的覆盖率


image.png


这样我们就测试完毕我们写的代码了。 那么我们认为目前测试用例覆盖了百分之百路径下面所有的分支,认为代码没有bug,测试通过。


  接下来,我们看下java版本的实现


public class Fintrhee {
    public List<Map<String,Integer>> find(List<Integer> list, Integer targert){
        List<Map<String,Integer>> resultList=new ArrayList<>();
        if (list.size()<3){
            return null;
        }
        for (int a=0;a<list.size();a++ ){
            for(int b=a;b<list.size();b++){
                for(int c=b;c<list.size();c++){
                    if (list.get(a)+list.get(b)+list.get(c)==targert && !new Integer(a).equals(new Integer(b))&&!new Integer(a).equals(new Integer(c))&&!new Integer(c).equals(new Integer(b))){
                        Map<String,Integer> map=new HashMap<>();
                        map.put("a",a);
                        map.put("b",b);
                        map.put("c",c);
                        resultList.add(map);
                    }
                }
            }
        }
        return resultList;
    }
}


测试代码:


public class FintrheeTest {
    @Test
    public void testFind() {
        Fintrhee fintrhee=new Fintrhee();
        List<Integer> integerList=new ArrayList<>();
        integerList.add(0);
        List<Map<String,Integer>> maps=fintrhee.find(integerList,1);
        assertEquals(null,maps);
    }
    @Test
    public void test2Find() {
        Fintrhee fintrhee=new Fintrhee();
        List<Integer> integerList=new ArrayList<>();
        integerList.add(1);
        integerList.add(2);
        integerList.add(3);
        List<Map<String,Integer>> maps=fintrhee.find(integerList,1);
        List<Map<String,Integer>> mapList=new ArrayList<>();
        assertEquals(maps,mapList);
    }
    @Test
    public void test3Find() {
        Fintrhee fintrhee=new Fintrhee();
        List<Integer> integerList=new ArrayList<>();
        integerList.add(1);
        integerList.add(2);
        integerList.add(3);
        List<Map<String,Integer>> maps=fintrhee.find(integerList,6);
        List<Map<String,Integer>> mapList=new ArrayList<>();
        Map<String,Integer> map=new HashMap<>();
        map.put("a",0);
        map.put("b",1);
        map.put("c",2);
        mapList.add(map);
        assertEquals(maps,mapList);
    }
}


测试结果:


image.png


覆盖率:


image.png


相关文章
|
7月前
【Leetcode】两数之和,给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
【Leetcode】两数之和,给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
|
算法
arr = [1,2,5,8,9,10,20,30,40] 有一个从小到大排序好的数组,现在输入一个数,要求按照原来的规律插入到数组中
arr = [1,2,5,8,9,10,20,30,40] 有一个从小到大排序好的数组,现在输入一个数,要求按照原来的规律插入到数组中
117 0
|
7月前
给定一个长度为n的数组,请将数组中元素按照奇偶性重新划分,所有奇数靠左边,所有偶数靠右边,然后分别对奇数、偶数部分进行排序
给定一个长度为n的数组,请将数组中元素按照奇偶性重新划分,所有奇数靠左边,所有偶数靠右边,然后分别对奇数、偶数部分进行排序
74 1
|
1月前
将奇数数组与偶数数组合并为一个数组
【10月更文挑战第29天】将奇数数组与偶数数组合并为一个数组。
25 4
|
7月前
|
存储 算法 索引
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数
数组求最大值和最小值的方法,数组写最大值和最小值的三元写法,数组取最小值,如何在数组中添加最后一个值,arr.push()添加数组放到后面,arr.unshift(‘red‘)添加的放到前面
数组求最大值和最小值的方法,数组写最大值和最小值的三元写法,数组取最小值,如何在数组中添加最后一个值,arr.push()添加数组放到后面,arr.unshift(‘red‘)添加的放到前面
|
6月前
|
C++
C++数组(定义、遍历、长度、地址、最大值、逆置、冒泡排序)
C++数组(定义、遍历、长度、地址、最大值、逆置、冒泡排序)
|
7月前
|
算法 测试技术 C#
【最大公约数 排序】2344. 使数组可以被整除的最少删除次数
【最大公约数 排序】2344. 使数组可以被整除的最少删除次数
|
7月前
|
存储 算法 Java
数据结构和算法面试题:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
数据结构和算法面试题:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
94 0
|
机器学习/深度学习 存储 算法
【简单算法】1.两数之和,给定整数数组和目标值,找出数组中2数之和等于目标值的元素
【简单算法】1.两数之和,给定整数数组和目标值,找出数组中2数之和等于目标值的元素
【简单算法】1.两数之和,给定整数数组和目标值,找出数组中2数之和等于目标值的元素