鱼C论坛

 找回密码
 立即注册
查看: 6206|回复: 20

第19课后题问题,求高手。

[复制链接]
发表于 2014-8-6 23:10:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
编写一个函数,判断传入的字符串参数是否为“回文联”(回文联即用回文形式写成的对联,既可顺读,也可倒读。例如:上海自来水来自海上)
if 后面就不太懂了,不知道,求懂得人能不能仔细讲讲
def palindrome(string):
    length = len(string)
    last = length-1
    length //= 2
    flag = 1
    for each in range(length):
        if string[each] != string[last]:
            flag = 0
        last -= 1

    if flag == 1:
        return 1
    else:
        return 0

string = input('请输入一句话:')
if palindrome(string) == 1:
    print('是回文联!')
else:
    print('不是回文联!')




小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-8-6 23:11:29 | 显示全部楼层
第二个题也有一个疑问,就是print 那个 i+1问题,为什么用i+1就可以判断是第几个字符串?
def count(*param):
    length = len(param)
    for i in range(length):
        letters = 0
        space = 0
        digit = 0
        others = 0
        for each in param[i]:
            if each.isalpha():
                letters += 1
            elif each.isdigit():
                digit += 1
            elif each == ' ':
                space += 1
            else:
                others += 1
        print('第 %d 个字符串共有:英文字母 %d 个,数字 %d 个,空格 %d 个,其他字符 %d 个。' % (i+1, letters, digit, space, others))
            
count('I love fishc.com.', 'I love you, you love me.')
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-6 23:13:55 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-7 00:15:47 | 显示全部楼层
关于”回文联“有两种方法实现。
1.用两个char指针,分别从前往后和从后往前进行比较。
2.准备一个字符数组,将其倒着写入,让后用字符串比较函数比较。
题主自己对号入座。
第三行不是这一句吗?for i in range(length):
好好琢磨。另外,计算机是以零作为第一个计算单位的吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-7 11:39:43 | 显示全部楼层
青蛙星 发表于 2014-8-7 00:15
关于”回文联“有两种方法实现。
1.用两个char指针,分别从前往后和从后往前进行比较。
2.准备一个字符数 ...

我自己编也能编出来,小甲鱼的这个程序我也知道他是把字符串分成两半,前后对比,可是下面的怎么回事,看不懂了,
if flag == 1:
        return 1
    else:
        return 0
不知道怎么回事啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-7 13:50:52 | 显示全部楼层
他不是有一个方法可以反转字符串的吗? 用没反转前的字符串判断反转后的字符串时候相等就可以了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-7 14:14:08 | 显示全部楼层
sunny989129 发表于 2014-8-7 11:39
我自己编也能编出来,小甲鱼的这个程序我也知道他是把字符串分成两半,前后对比,可是下面的怎么回事,看 ...

flag开始就是 赋值的 1。如果string[each] != string[last] 满足就说明不是回文联 flag就赋为 0。
if flag == 1:
        return 1
    else:
        return 0
      从中可知,当 flag 为 1时, 函数返回 1,当 flag 为 0时, 函数就返回 0。此时 flag 就功能上相当于标识符,用来标示 数组是不是回文联。你当然你也可以直接在string[each] != string[last] 时直接返回 0。但样做更简单,但是没有 条件思想。
      小甲鱼思路是这样的, if string[each] != string[last]: 来判断 回文联 是否成立,并用flag标示。再用
if flag == 1:
        return 1
    else:
        return 0
根据标示符返回对应的值。现在只是一个标示符,所以直接返回比较方便,但如果标示符有十几个时,直接返回思路的修改会变得非常麻烦。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-7 18:58:53 | 显示全部楼层
青蛙星 发表于 2014-8-7 14:14
flag开始就是 赋值的 1。如果string[each] != string[last] 满足就说明不是回文联 flag就赋为 0。
if f ...

貌似有点明白了,谢谢指教哈哈,在帮忙看看第二个程序吧,就有一个小疑问,指点下。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-7 19:13:57 | 显示全部楼层
sunny989129 发表于 2014-8-7 18:58
貌似有点明白了,谢谢指教哈哈,在帮忙看看第二个程序吧,就有一个小疑问,指点下。
  1. def count(*param):            #定义函数
  2.     length = len(param)       #获取输入字符串个数
  3.     for i in range(length):     #遍历输入的字符串,若输入一组字符串,就对这一组字符串进行循环,若输入两组,就分别对每一组进行循环遍历         
  4.         letters = 0                   #初始化英文字母个数
  5.         space = 0                 #初始化空格个数
  6.         digit = 0                   #初始化数字个数
  7.         others = 0                  #初始化其他字符个数
  8.         for each in param[i]:   #对输入的每一组字符串进行遍历,param[i]的含义是遍历第一个之后在进行下一个,取决于length的大小
  9.             if each.isalpha():    #判断是否为字母,是的话etters加一个
  10.                 letters += 1
  11.             elif each.isdigit():   #其含义与上面相似
  12.                 digit += 1
  13.             elif each == ' ':
  14.                 space += 1
  15.             else:
  16.                 others += 1
  17.         print('第 %d 个字符串共有:英文字母 %d 个,数字 %d 个,空格 %d 个,其他字符 %d 个。' % (i+1, letters, digit, space, others))
  18.             # i+1 代表输入的第几组字符串,由  i = 0即为第一组,i=1即为第二组 其值由上面for i in range(length)获得
  19. count('I love fishc.com.', 'I love you, you love me.')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 3 反对 0

使用道具 举报

 楼主| 发表于 2014-8-7 19:50:02 | 显示全部楼层

懂了,麻烦可以第一题也这样详细的讲解下?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-7 20:57:43 | 显示全部楼层
本帖最后由 jijidata 于 2014-8-7 21:02 编辑
sunny989129 发表于 2014-8-7 19:50
懂了,麻烦可以第一题也这样详细的讲解下?
  1. def palindrome(string):
  2.     length = len(string)            #获取字符串长度
  3.     last = length-1                   #last的含义是输入的字符串的最后一个字符的索引值,也就是倒数第一个字符的索引值
  4.     length //= 2                      #符串长度除以2取整,再赋值给length
  5.     flag = 1                             #初始化一个flag 值为1
  6.     for each in range(length):   #对字符串前一半字符进行遍历,判断是否等于后一半
  7.         if string[each] != string[last]:   #依次判断第一个字符是否等于最后一个,第二个字符串是否等于倒数第二个....直至字符串中间的那组字符,只要字符串其中有一个互相不相等,flag = 0,flag =0就表示不是回文了
  8.             flag = 0
  9.         last -= 1                         #循环一次last值减去1,表示倒数第二个,第三个....字符的索引值

  10.     if flag == 1:                       #判断,如果flag等于1,返回True
  11.         return 1                        #判断,否则,返回False
  12.     else:
  13.         return 0

  14. string = input('请输入一句话:')
  15. if palindrome(string) == 1:
  16.     print('是回文联!')
  17. else:
  18.     print('不是回文联!')
复制代码


其实还有种更简单的方法:
  1. def check():
  2.     temp =str(input("请输入一句话:"))
  3.     if temp==temp[::-1]:
  4.         print("是回文联")
  5.     else:
  6.         print("不是回文联")

  7. check()
复制代码

  1. temp[::-1]
复制代码
意思是将整个字符串反转
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2014-8-7 21:32:42 | 显示全部楼层
jijidata 发表于 2014-8-7 20:57
其实还有种更简单的方法:

这个好,没想到分割还可以用在这里。。。
这是我编的:
def test():
    temp=input('请输入一句话:')
    if list(temp)==list(reversed(temp)):
        print('是回文联')
    else:
        print('不是回文联')
test()
        
我第一个编的稍微有点麻烦,看了小甲鱼的学者编了第二个,我基础不好,很多编程都没见过,也不知道还可以这样用。。。。看了很多的人的代码感觉受益良多。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-7 21:43:16 | 显示全部楼层
sunny989129 发表于 2014-8-7 21:32
这个好,没想到分割还可以用在这里。。。
这是我编的:
def test():

互相加油吧!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-7 21:49:23 | 显示全部楼层

恩恩
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-7 21:53:01 | 显示全部楼层
jijidata 发表于 2014-8-7 20:57
其实还有种更简单的方法:

仔细看了下你的这个剪短的代码,其实你第二句不用加 str 就可以,直接temp=input('请输入一句话:')
因为input()返回给temp的值都是以字符串形式返回的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-7 22:02:49 | 显示全部楼层
sunny989129 发表于 2014-8-7 21:53
仔细看了下你的这个剪短的代码,其实你第二句不用加 str 就可以,直接temp=input('请输入一句话:')
因 ...

习惯而已~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-7 22:25:06 | 显示全部楼层
前来观看哦。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-26 17:15:18 | 显示全部楼层
同样不会来找问答,结果看到@jijidata的回答~
谢谢大神!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-27 09:21:49 | 显示全部楼层
受教了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-26 19:44:34 | 显示全部楼层
jijidata 发表于 2014-8-7 20:57
其实还有种更简单的方法:

def Huiwen():  
    str1 = input('请输入一句话:')
    list1 = list(str1)
    list2 = list1.reverse()
    length = len(str1)
   
    for i in range(length):
        if list1[i] == list2[i]:
            return 1
        else:
            return 0
if Huiwen() == 1:
    print('是回文联!')
else:
    print('不是回文联!')
Huiwen()  


也是用了倒转的方法,怎么就行不通呢,请教大神
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-14 02:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表