设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 10518|回复: 10
打印 上一主题 下一主题

求助!代码运行到后面,条件语句不执行,导致结果没有...

[复制链接]

1

主题

0

好友

19

积分

新手上路

Rank: 1

跳转到指定楼层
楼主
发表于 2018-4-12 10:29:27 |只看该作者 |倒序浏览
#给定一个包含 n 个整数的数组 S,是否存在属于 S 的三个元素 a,b,c 使得 a + b + c = 0 ?找出所有不重复的三个元素组合使三个数的和为零。

#注意:结果不能包括重复的三个数的组合。

#下面代码只输出了部分组合,调试发现运行到后面满足 nums+nums[j]+nums[k]==0时,后面的语句不执行了。求大神指教~
def threeSum(nums):
        nums.sort()
        a=[]
        for i in range(0,len(nums)-2):
            for j in range(i+1,len(nums)-1):
                for k in range(j+1,len(nums)):
                    if nums+nums[j]+nums[k]==0:
                        list=[nums,nums[j],nums[k]]
                        if len(a)==0:
                            a.append(list)
                        else:
                            r=0
                            for i in range(0,len(a)):
                                if list.__eq__(a):
                                    r=1
                            if r==0:
                                a.append(list)

        return a


nums=[-4,-2,-2,-2,0,1,2,2,2,3,3,4,4,6,6]
print threeSum(nums)

回复

使用道具 举报

1

主题

0

好友

19

积分

新手上路

Rank: 1

沙发
发表于 2018-4-12 10:33:21 |只看该作者
代码运行结果:[[-4, -2, 6], [-4, 0, 4], [-2, -2, 4], [-2, 0, 2]]
正确结果应该是:[[-4,-2,6],[-4,0,4],[-4,1,3],[-4,2,2],[-2,-2,4],[-2,0,2]]
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

板凳
发表于 2018-4-12 11:45:07 |只看该作者
nums+nums[j]+nums[k]==0
你这么写程序居然还能执行?

你先把实际的代码发上来吧。另外就是你自己在代码里多加 print 输出,看看中间的数据是什么
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

1

主题

0

好友

19

积分

新手上路

Rank: 1

地板
发表于 2018-4-12 20:41:58 |只看该作者
本帖最后由 wanghui 于 2018-4-12 20:57 编辑
crossin先生 发表于 2018-4-12 11:45
nums+nums[j]+nums[k]==0
你这么写程序居然还能执行?

回复

使用道具 举报

1

主题

0

好友

19

积分

新手上路

Rank: 1

5#
发表于 2018-4-12 20:57:02 |只看该作者
本帖最后由 wanghui 于 2018-4-12 20:58 编辑
wanghui 发表于 2018-4-12 20:41
我源代码是nums+nums[j]+nums[k]==0,不知道为什么贴出来就变成nums+nums[j]+nums[k]==0。[/ba ...
  1. def threeSum(nums):
  2.         nums.sort()
  3.         a=[]
  4.         for i in range(0,len(nums)-2):
  5.             for j in range(i+1,len(nums)-1):
  6.                 for k in range(j+1,len(nums)):
  7.                     if nums[i]+nums[j]+nums[k]==0:
  8.                         list=[nums[i],nums[j],nums[k]]
  9.                         if len(a)==0:
  10.                             a.append(list)
  11.                         else:
  12.                             r=0
  13.                             for i in range(0,len(a)):
  14.                                 if list.__eq__(a[i]):
  15.                                     r=1
  16.                             if r==0:
  17.                                 a.append(list)
  18.                                                                
  19.         return a
  20.                                             
  21.          
  22. nums=[-4,-2,-2,-2,0,1,2,2,2,3,3,4,4,6,6]
  23. print threeSum(nums)
复制代码
回复

使用道具 举报

2

主题

0

好友

476

积分

中级会员

Rank: 3Rank: 3

6#
发表于 2018-4-12 22:51:01 |只看该作者
本帖最后由 风扇很响 于 2018-4-12 22:58 编辑

你这个为什么要这么麻烦呢,直接用itertools加上一个去重处理不就完了吗。。。"选择困难的农药召唤师"那题里面提到了啊。。。


#给定一个包含 n 个整数的数组 S,是否存在属于 S 的三个元素 a,b,c
#使得 a + b + c = 0 ?找出所有不重复的三个元素组合使三个数的和为零。
#注意:结果不能包括重复的三个数的组合。

#题意不明,是说三个数的组合不能重复,即[1,2,-3]和[2,1,-3]视为同一种组合
#还是三个数之间不能重复,即不能出现[1,1,-2]这样的组合?
#先按第一种做

import itertools

def Sum_N_S(nums, N, S):
    #N是相加的数的个数,S是这N个数之和
    t = []
    for item in itertools.combinations(nums, N):
        if sum(item) == S:
            if item not in t:
                t.append(item)
    return t

nums = [-4,-2,-2,-2,0,1,2,2,2,3,3,4,4,6,6]
print(Sum_N_S(nums, 3, 0))


Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>>
============== RESTART: D:\Python36\code\crossin\数组三个元素相加为0.py ==============
[(-4, -2, 6), (-4, 0, 4), (-4, 1, 3), (-4, 2, 2), (-2, -2, 4), (-2, 0, 2)]
>>>
回复

使用道具 举报

1

主题

0

好友

19

积分

新手上路

Rank: 1

7#
发表于 2018-4-12 22:59:07 |只看该作者
风扇很响 发表于 2018-4-12 22:51
你这个为什么要这么麻烦呢,直接用itertools加上一个去重处理不就完了吗。。。"选择困难的农药召唤师"那题 ...

哦哦,我刚开始接触,对python函数和工具还不熟。领教了,多谢!但还是想问一下您知道我的代码问题出在哪里吗?
回复

使用道具 举报

2

主题

0

好友

476

积分

中级会员

Rank: 3Rank: 3

8#
发表于 2018-4-12 23:17:19 |只看该作者
wanghui 发表于 2018-4-12 22:59
哦哦,我刚开始接触,对python函数和工具还不熟。领教了,多谢!但还是想问一下您知道我的代码问题出在哪 ...

不敢当,我也刚学python没多久。你现在是结果有遗留,我感觉是三个for循环的边界条件没写好导致的,一会加1一会减1的很容易漏结果啊...具体的还是要你自己多加print多调试了......
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

9#
发表于 2018-4-12 23:50:03 |只看该作者
风扇很响 发表于 2018-4-12 22:51
你这个为什么要这么麻烦呢,直接用itertools加上一个去重处理不就完了吗。。。"选择困难的农药召唤师"那题 ...

赞一个!
看来推送都有认真看,我很欣慰
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

10#
发表于 2018-4-12 23:52:40 |只看该作者
wanghui 发表于 2018-4-12 22:59
哦哦,我刚开始接触,对python函数和工具还不熟。领教了,多谢!但还是想问一下您知道我的代码问题出在哪 ...

你上下两个 i 冲突了

如果你把每次的i,j,k 都 print 出来,应该就能发现这个问题了
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-26 06:53 , Processed in 0.024447 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部