【问题标题】:Cut m and n letters from end of string, then find number of turns to get back original string从字符串末尾剪切 m 和 n 个字母,然后找到转数以取回原始字符串
【发布时间】:2020-09-16 19:35:59
【问题描述】:

问题:给定一个字符串和m和n。

输入1:原始字符串

输入 2:m(小于字符串长度):从字符串末尾剪切 m 个字母,然后添加到字符串开头。

输入3:n(小于字符串长度):从上面步骤中获得的字符串末尾剪切n个字母,然后添加到该字符串的开头。

此过程继续进行,需要找出返回原始字符串所需的转数。

def harry(str, m, n):
    le = len(str)
    org = str.upper()
    str = str.upper()
    turn = 0
    for i in str:
        str3 = str[-m:] # last n letters
        str = str.replace(' ', '')[:-m]
        str = str3 + str
        print(str)
        if org != str:
            turn = turn + 1
            str4 = str[-n:]
            str = str.replace(' ', '')[:-n]
            str= str4 + str
            print(str)
            turn = turn + 1
        if org == str:
            break
    print(turn)

str = input("Enter the string")
m=int(input("Enter the value of m"))
n=int(input("Enter the value of n"))
harry(str, m, n)

获得的输出:

Enter the stringarya
Enter the value of m1
Enter the value of n2
AARY
RYAA
ARYA
2

要获得的原始输出:

3 

(需要3个回合才能找回原始字符串Arya。)

除了这样的单词之外,我得到了所有单词的输出,尤其是当同一个字母连续出现时。 请帮我解决这个问题。

【问题讨论】:

  • 你能给出失败的地方吗?
  • 在第二次迭代中,原始字符串 arya 在 str 中获得,如果条件不增加 turn 即 turn 仅为 2,则直接进入第二次迭代,因为第二次迭代本身条件为真。(在第9步,2次迭代后得到str=arya时,不计同)。在不增加转弯的情况下,它会跳转到打印转弯。希望对您来说很清楚。我认为 for 循环条件不正确。
  • 问题在于分配和增加转弯值。
  • 如果有帮助,请始终通过接受答案来结束您的问题:)。

标签: string cut letter


【解决方案1】:

实际上,您至少会采取一步来查看它们是否相等。所以轮到你应该从 1 开始。

见:https://ide.geeksforgeeks.org/Hw4AWx1O95

def harry(str, m, n):
    le = len(str)
    org = str.upper()
    str = str.upper()
    turn = 1 # <--------Here
    for i in str:
        str3 = str[-m:] # last n letters
        str = str.replace(' ', '')[:-m]
        str = str3 + str
        print(str)
        if org != str:
            turn = turn + 1
            str4 = str[-n:]
            str = str.replace(' ', '')[:-n]
            str= str4 + str
            print(str)
        if org == str:

            break
        turn = turn + 1 #< --------------- Here 

    print(turn)

str = input("Enter the string\n")
m=int(input("Enter the value of m\n"))
n=int(input("Enter the value of n\n"))
harry(str, m, n)

【讨论】:

    【解决方案2】:
    word = input()
    m = int(input())
    n = int(input())
    
    count = 1
    word2 = word[-1*m:] + word[:len(word)-m]
    
    #print("Starting with",word2)
    
    while(word != word2):
        if(count%2 != 0):
            word2 = word2[-1*n:] + word2[:len(word2)-n]
        else:
            word2 = word2[-1*m:] + word2[:len(word2)-m]
    
        #print("String now", word2)
        count+=1
    
    print(count)
    

    【讨论】:

      【解决方案3】:

      我的方法不同。假设 s、n 和 m 是输入长度,我们必须从字符串 s 的末尾剪切并添加到开头。

      解释:假设字符串 s 是 'bcdefghijklmnop' 并且 n 和 m 是 2 和 3。切割 2 长度字符串后: opbcdefghijklmn 3 长度 lmnopbcdefghijk 和 this过程继续,直到它形成原始字符串

      以上部分我们都知道

      结论:字符串的长度必须能被n+m(或*)整除,因为可以看到 它正在形成这样的系列 n+m+n+m+n+m+.....+ 所以它要么以 n 或 m 结尾,即

      1. (length_of_string % (n+m)==0) 如果它以 m 结尾。 --> (n+m)*k

        答案 --> (length_of_string/(n+m))*2
        2 在这里相乘,因为它包括 n 和 m。

        否则

      2. *(length_of_string % (n+m)==n) 如果它以 n 结尾。 --> (n+m)*k + n

        答案 --> (length_of_string/(n+m))*2 + 1

        1 是为 n 额外添加的

      这是我的代码:

      ls = len(input())
      n=int(input())
      m=int(input())
      x=n+m
      if(ls%x==0):
          print(ls//x<<1)
      elif(ls%x==n):
          print((ls//x<<1)+1)
      

      我希望这对你有用。如果没有,请评论下来。

      【讨论】:

      • 但是如果字符串是“opopopop”并且 n = 2 和 m = 2 怎么办?
      【解决方案4】:
      #include<bits/stdc++.h>
      
      using namespace std;
      
      int findmin(string s ,int m, int n){
          
          int len=s.length();
          int count=1;
          string q=s.substr(len-m,m)+s.substr(0,len-m);
          int cut=n;
          while(q!=s){
              q=q.substr(len-cut,cut)+q.substr(0,len-cut);
              if(cut==m){
                  cut=n;
              }
              else{
                  cut=m;
              }
              count++;
          }
          return count;
      }
      
      int main() {
          int t;
          cin>>t;
          while(t--){
              string s;
              cin>>s;
              int m,n;
              cin>>m>>n;
              cout<<findmin(s,m,n)<<"\n";
          }
      }
      

      【讨论】:

      • 请在您的答案中添加 cmets 以解释您的想法
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多