鱼C论坛

 找回密码
 立即注册
查看: 1495|回复: 9

[已解决]关于每日一题第253题,字符串排序的问题

[复制链接]
发表于 2019-10-10 17:03:39 | 显示全部楼层 |阅读模式
66鱼币
本帖最后由 x287208793 于 2019-10-10 17:03 编辑

如题,上半部分,被我折腾出来了,后面排序,填充空格,试了好久都没写出来,来个大佬指点下
每日一题第253题

以下是我折腾的部分代码:
  1. def the_words(words,maxwidth):
  2.     new_words = []
  3.     while words:
  4.         sum = 0
  5.         for each in words:   #遍历words列表中的每个元素
  6.             sum += len(each) +1   #获取每个元素的累加后的字符长度,每个字符加上一个空格['this is an ']
  7.             if sum > maxwidth:    #如果遍历累加后的长度大于分割长度maxwidth
  8.                 new_words.append(' '.join(words[0:words.index(each)]))
  9.                 words = words[words.index(each):]
  10.                 break
  11.             elif sum == maxwidth:
  12.                 new_words.append(' '.join(words[0:(words.index(each) + 1)]))
  13.                 words = words[(words.index(each) + 1):]
  14.                 break
  15.             elif sum < maxwidth and len(' '.join(words) ) < maxwidth:
  16.                 new_words.append(' '.join(words))
  17.                 words = []
  18.                 break
  19.     print(new_words)


  20. words =  ["This", "is", "an", "example", "of", "text", "justification."]
  21. maxwidth = 16

  22. the_words(words,maxwidth)
复制代码
最佳答案
2019-10-10 17:03:40
  1. def kao(lst, maxwidth):
  2.     result = []
  3.     for w in lst:
  4.         spaces = maxwidth - len(w)
  5.         lt = w.split()
  6.         slen = len(lt)
  7.         if slen == 1:
  8.             lt[0] = lt[0] + '龢' * spaces            
  9.         if slen > 1:
  10.             a, b = divmod(spaces, slen - 1)
  11.             if a > 0:
  12.                 for ele in range(slen - 1):
  13.                     lt[ele] = lt[ele] + '龢' * a
  14.             if b > 0:
  15.                 for ele in range(0, b):
  16.                     lt[ele] = lt[ele] + '龢'
  17.         ss = '龢'.join(lt)
  18.         result.append(ss.replace('龢', ' '))
  19.     return result

  20. print(kao(the_words(words, maxwidth), maxwidth))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-10 17:03:40 | 显示全部楼层    本楼为最佳答案   
  1. def kao(lst, maxwidth):
  2.     result = []
  3.     for w in lst:
  4.         spaces = maxwidth - len(w)
  5.         lt = w.split()
  6.         slen = len(lt)
  7.         if slen == 1:
  8.             lt[0] = lt[0] + '龢' * spaces            
  9.         if slen > 1:
  10.             a, b = divmod(spaces, slen - 1)
  11.             if a > 0:
  12.                 for ele in range(slen - 1):
  13.                     lt[ele] = lt[ele] + '龢' * a
  14.             if b > 0:
  15.                 for ele in range(0, b):
  16.                     lt[ele] = lt[ele] + '龢'
  17.         ss = '龢'.join(lt)
  18.         result.append(ss.replace('龢', ' '))
  19.     return result

  20. print(kao(the_words(words, maxwidth), maxwidth))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-10 21:30:17 | 显示全部楼层
  1. def the_words(words,maxwidth):
  2.     new_words = []
  3.     while words:
  4.         sum_word = 0
  5.         del_word = []
  6.         for each in words:   #遍历words列表中的每个元素
  7.             sum_word += len(each)
  8.             del_word.append(each)
  9.             if sum_word > maxwidth:
  10.                 s = len(del_word)-1    # s 需要的字符长度
  11.                 n = maxwidth - sum([len(a) for a in words[0:s]])  
  12.                 if s == 1:  # 如果只有一个字符时,左边对齐
  13.                      
  14.                     woed_i = words[0] + (' '*n)
  15.                 else:
  16.                     a = int(n / (s - 1))  # 平均的space填充
  17.                     m = n - a*(s-1)      
  18.                     woed_i=''   # 由于是左右两边对其,所有先把多余的space填充左边, 然后join
  19.                     for i in range(m):
  20.                         woed_i += words[i] + ' '*(a+1)
  21.                     woed_i = woed_i + ((' '*a).join(words[m:s]))

  22.                 new_words.append(woed_i)
  23.                 words = words[s:]
  24.                 break
  25.             elif sum_word == maxwidth:
  26.                 s = len(del_word)
  27.                 new_words.append(' '.join(words[0:s]))
  28.                 words = words[s:]
  29.                 break
  30.             elif sum_word < maxwidth and len(' '.join(words) ) < maxwidth:
  31.                 space = maxwidth-sum(len(a) for a in words)-(len(words)-1) # 计算出最后一行的space数
  32.                 new_words.append(' '.join(words)+(' '*space))
  33.                 words = []
  34.                 break
  35.             else:
  36.                 sum_word +=1
  37.     print(new_words)
  38.    
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
x287208793 + 5 + 5 + 3 感谢!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-10 21:42:06 | 显示全部楼层
本帖最后由 XiaoPaiShen 于 2019-10-10 23:00 编辑

先说一下该题的需求:
1. 如果一行只能容纳一个单词,就左对齐。
2. 如果是最后一行,也是左对齐。
3. 其他情况要两端对齐,空格要均匀填充到单词之间。
4. 如果还有多余的空格,把它们挨个填充在前面的空隙中。

  1. def the_words(words,max_width):
  2.    
  3.     result = []             # 最终输出结果
  4.    
  5.     if not words:
  6.         return result       # 如果没有排版单词,输出空结果      

  7.     index = 0
  8.     len_words = len(words)  # 单词个数
  9.     row_position = 0        # 一行中摆放单词的位置
  10.     row_content = []        # 一行中临时放置的单词   
  11.    
  12.     while index < len_words:
  13.         # 把单词一个一个往临时行里放,单词间先留一个空格,看一行能放多少
  14.         if (row_position + len(words[index])) <= max_width:               
  15.             row_position += (len(words[index]) + 1)
  16.             row_content.append(words[index])
  17.             index += 1
  18.             
  19.             continue
  20.         else:               
  21.             if len(row_content) == 1:                       # 只有一个单词
  22.                 extra_space = max_width - len(row_content[0])    # 计算出后面应有多少空格
  23.                 result.append('{0}{1}'.format(row_content[0], ' '*extra_space))               
  24.             else:
  25.                 row_words = len(row_content)                        # 该行多少个单词
  26.                 total_space = max_width - row_position + row_words  # 计算该行总共应有多少空格
  27.                 avg_space = total_space // (row_words - 1)          # 单词间平均空格数
  28.                 extra_space = total_space % (row_words - 1)         # 平均分配空格后,剩余的空格数

  29.                 temp = ''
  30.                 if extra_space > 0:     # 单词间除了平均数的空格外,还有多余的空格
  31.                     for word in row_content[:-1]:
  32.                         if extra_space > 0:
  33.                             temp += word + ' '*(avg_space + 1)  # 前面单词空格数比平均数多1
  34.                             extra_space -= 1
  35.                         else:
  36.                             temp += word + ' '*(avg_space)      # 后面单词空格数为平均数
  37.                     temp += row_content[-1]                     # 加上该行最后一个单词,后面没空格

  38.                 else:
  39.                     temp = (' '*avg_space).join(row_content) # 单词间空格数都一样

  40.                 result.append(temp)     # 排好版的一行放入结果中               

  41.             row_content.clear()
  42.             row_position = 0

  43.     # 最后一行,没填满该行,单词之间只有一个空格,后面以空格填充
  44.     temp = ' '.join(row_content)
  45.     result.append(temp + ' '*(max_width-len(temp)))
  46.         
  47.     return result

  48. words =  ["This", "is", "an", "example", "of", "text", "justification."]
  49. maxwidth = 16

  50. print(the_words(words,maxwidth))
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
x287208793 + 5 + 5 + 3 感谢!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-12 09:02:14 | 显示全部楼层

请问为什么要用 ‘龢’ 代替空格,后面又做replace置换,不能直接用' '
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-12 09:37:29 | 显示全部楼层
x287208793 发表于 2019-10-12 09:02
请问为什么要用 ‘龢’ 代替空格,后面又做replace置换,不能直接用' '

可以直接用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-10-12 11:11:25 | 显示全部楼层

我是问,为毛不直接用 空格字符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-12 11:20:23 | 显示全部楼层
  1. def kao(lst:list, maxwidth:int):
  2.     blank= ' '
  3.     result = []
  4.     for w in lst:
  5.         spaces = maxwidth - len(w)
  6.         lt = w.split()
  7.         slen = len(lt)
  8.         if slen == 1:
  9.             lt[0] = lt[0] + blank * spaces
  10.         elif slen > 1:
  11.             a, b = divmod(spaces, slen - 1)
  12.             if a > 0:
  13.                 for ele in range(slen - 1):
  14.                     lt[ele] = lt[ele] + blank * a
  15.             if b > 0:
  16.                 for ele in range(0, b):
  17.                     lt[ele] = lt[ele] + blank
  18.         ss = blank.join(lt)
  19.         result.append(ss)
  20.     return result
  21. lst = ['This is an', 'example of text', 'justification.']


  22. maxwidth = 16

  23. print(kao(lst, maxwidth))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-12 11:48:28 | 显示全部楼层
x287208793 发表于 2019-10-12 11:11
我是问,为毛不直接用 空格字符

中间调试时,看效果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-12 13:29:34 | 显示全部楼层
什么是 the_words ?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 13:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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