鱼C论坛

 找回密码
 立即注册
查看: 2009|回复: 5

[已解决]一道基础题 想不明白该咋做了

[复制链接]
发表于 2022-6-3 14:08:17 | 显示全部楼层 |阅读模式
10鱼币
fishc.png
这种类型的题一直不会做,烦请会做这道题的大佬能顺便给我讲一下这类题的解题思路,多谢
最佳答案
2022-6-3 14:08:18
本帖最后由 阿奇_o 于 2022-6-4 10:01 编辑

嗯,思路我想通常至少有两点吧:  
  1. 因为字符串是"不可变的"数据类型,所以字符串通常要结合列表来方便操作(如转为列表,或用另一个列表来做临时存储或中间变量)
  2. m行n列,或N行N列,这些矩阵,基本上都要遍历,所以通常 就是两个for循环进行遍历。
      其次,就是具体看题目怎么要求,注意 观察下标和元素的变化规律,以及下标之间的关系;注意+1还是-1 ;注意边界(走到最后下标是否越界)
      比如,这里的"对角线",其实就是每行的"列号/下标"有着这样的固定关系: row[ i ] = row[len(s)-1-i] = '*'   (你直接试算一下就知道了,第一行是0,4,第二行是1,3,。。)
所以,
def func(s):
    for i in range(len(s)):  # 作为行号,也作为 字符串的下标
        for j in range(len(s)):  # 作为列号
            row = [s[i],] * len(s)   # 先全部设为
            row[i] = row[len(s)-i-1] = '*'   # 再修改(隐去)指定位置的字符
        print(''.join(row))

        
func(s='12Aab')
*111*
2*2*2
AA*AA
a*a*a
*bbb*

---------------
#复盘: 这里嵌套的for j in ... 其实是多余的(会在相同位置上"修改"),所以 最终应该是:
def f(s):
    for i in range(len(s)):
        row = [s[i],] * len(s)
        row[i] = row[len(s)-1-i] = '*'
        print(''.join(row))

        

最佳答案

查看完整内容

嗯,思路我想通常至少有两点吧: 1. 因为字符串是"不可变的"数据类型,所以字符串通常要结合列表来方便操作(如转为列表,或用另一个列表来做临时存储或中间变量) 2. m行n列,或N行N列,这些矩阵,基本上都要遍历,所以通常 就是两个for循环进行遍历。 其次,就是具体看题目怎么要求,注意 观察下标和元素的变化规律,以及下标之间的关系;注意+1还是-1 ;注意边界(走到最后下标是否越界) 比如,这里 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-6-3 14:08:18 | 显示全部楼层    本楼为最佳答案   
本帖最后由 阿奇_o 于 2022-6-4 10:01 编辑

嗯,思路我想通常至少有两点吧:  
  1. 因为字符串是"不可变的"数据类型,所以字符串通常要结合列表来方便操作(如转为列表,或用另一个列表来做临时存储或中间变量)
  2. m行n列,或N行N列,这些矩阵,基本上都要遍历,所以通常 就是两个for循环进行遍历。
      其次,就是具体看题目怎么要求,注意 观察下标和元素的变化规律,以及下标之间的关系;注意+1还是-1 ;注意边界(走到最后下标是否越界)
      比如,这里的"对角线",其实就是每行的"列号/下标"有着这样的固定关系: row[ i ] = row[len(s)-1-i] = '*'   (你直接试算一下就知道了,第一行是0,4,第二行是1,3,。。)
所以,
def func(s):
    for i in range(len(s)):  # 作为行号,也作为 字符串的下标
        for j in range(len(s)):  # 作为列号
            row = [s[i],] * len(s)   # 先全部设为
            row[i] = row[len(s)-i-1] = '*'   # 再修改(隐去)指定位置的字符
        print(''.join(row))

        
func(s='12Aab')
*111*
2*2*2
AA*AA
a*a*a
*bbb*

---------------
#复盘: 这里嵌套的for j in ... 其实是多余的(会在相同位置上"修改"),所以 最终应该是:
def f(s):
    for i in range(len(s)):
        row = [s[i],] * len(s)
        row[i] = row[len(s)-1-i] = '*'
        print(''.join(row))

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

使用道具 举报

发表于 2022-6-3 14:28:34 | 显示全部楼层
一步一步来
#!/usr/bin/env python
#coding=utf-8

def replace(string, index, ch):
    temp = list(string)
    temp[index] = ch
    return ''.join(temp)

def output(s):
    for i in s: print(i)

string = input()
length = len(string)

result = []
for i in range(0, length):
    result.append(string[i] * length)

#print(result)

# 左上角到右下角
for i in range(0, length):
    result[i] = replace(result[i], i, '*')

#print(result)

# 左下角到右上角
for i in range(0, length):
    result[i] = replace(result[i], length - i - 1, '*')

#print(result)
output(result)

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
于熙顿 + 1 + 1 感谢楼主无私奉献!

查看全部评分

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

使用道具 举报

发表于 2022-6-3 14:31:43 | 显示全部楼层
本帖最后由 森亦简 于 2022-6-3 14:46 编辑
string = input("请输入字符串:")
lenth = len(string)
picture = []
picture_list=[]
picture_str=[]
m = ""
for i in range(lenth):                      
    picture.append(string[i]*lenth)         ##先创建一个列表picture,里面的元素为:单个字符串*行数
    picture_list.append(list(picture[i]))   ##再创建一个列表picture_list,将单个字符串*行数转换成列表的形式作为picture_list的元素
    picture_list[i][lenth-i-1] = "*"        ##用"*"替换左对角线的字符,替换后返回picture_list
    picture_list[i][i] = "*"                ##用"*"替换右对角线的字符,替换后返回picture_list
    
for each in picture_list:
    for i in range(lenth):
        m = m + each[i]                     ##将picture_list中的元素转化为连续的字符串    
    picture_str.append(m)                   ##将转换后连续的字符串存入picture_str
    m = ""

for each in picture_str:                    ##打印picture_str中连续的字符串
    print(each)
    

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
于熙顿 + 1 + 1 感谢楼主无私奉献!

查看全部评分

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

使用道具 举报

发表于 2022-6-3 16:49:50 | 显示全部楼层
本帖最后由 allen-xy 于 2022-6-3 16:53 编辑
# 思路:
# 1、首先,字符串长度=输出行数。
# 2、其次,每行的第(行数)个和第(字符串长度-行数)个字符是特殊称号。
# 3、最后,每行的其他位置是字符串的第(行数)个字符。
# 4、最最后,利用列表将每行写入子列表中,再使用join方法输出。

def formated(s):
    lens = len(s)
    l = []

    for i in range(lens):       # 输出每一行。
        l.append([])
        ss = s[i]               # ss是每一行的主要字符
        a = lens - i - 1        # a是每一行第i个字符的对称位置
        for j in range(lens):   # 输出每一行中的第j个字符。
            if j == i or j == a:    # 第i个和第lens-i-1个字符为特殊符号。
                l[i].append('*')
            else:
                l[i].append(ss)
    # print(l)

    for i in range(len(l)):
        print(''.join(l[i]))

formated(s=input("请输入字符串:"))

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
于熙顿 + 1 + 1 感谢楼主无私奉献!

查看全部评分

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

使用道具 举报

 楼主| 发表于 2022-6-3 20:42:28 | 显示全部楼层
感谢各位大佬的帮助,终于弄明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 01:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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