String 将字符串k*水平乘以v*垂直乘以

String 将字符串k*水平乘以v*垂直乘以,string,scala,multiplication,String,Scala,Multiplication,问题: 您将获得一个由n行组成的字符串,每个子字符串的长度为n个字符。例如: s = "abcd\nefgh\nijkl\nmnop" 字符串的k水平缩放包括复制字符串中除“\n”以外的每个字符的k倍 字符串的v垂直缩放包括复制v乘以平方字符串的每个部分 函数scalestrng,k,v将执行k水平缩放和v垂直缩放 例如: a = "abcd\nefgh\nijkl\nmnop" scale(a, 2, 3) --> "aabbccdd\naabbccdd\naabbccdd\neeff

问题:

您将获得一个由n行组成的字符串,每个子字符串的长度为n个字符。例如:

s = "abcd\nefgh\nijkl\nmnop"
字符串的k水平缩放包括复制字符串中除“\n”以外的每个字符的k倍

字符串的v垂直缩放包括复制v乘以平方字符串的每个部分

函数scalestrng,k,v将执行k水平缩放和v垂直缩放

例如:

a = "abcd\nefgh\nijkl\nmnop"
scale(a, 2, 3) --> "aabbccdd\naabbccdd\naabbccdd\neeffgghh\neeffgghh\neeffgghh\niijjkkll\niijjkkll\niijjkkll\nmmnnoopp\nmmnnoopp\nmmnnoopp".
我的问题是,我已经编写了这个函数,根据我的喜好,它是完全正确的

但是当我尝试运行程序通过测试时,出现了一个bug,由于这个bug,我的程序没有通过任何测试

我把测试附在问题的底部,请帮忙

object Kata {

    def scale(xs: String, k: Int, n: Int): String ={
      if(xs=="")
        ""
      else
      xs.split("\n")
   .map(_.map(_.toString*k).mkString("","","\n") * n)
   .mkString
      }



}

首先将每行的每个字母复制k次,然后将每行复制v次

总结:

 def scale(xs: String, k: Int, n: Int): String = xs
 .split("\n")
 .flatMap { line =>
   val repeatKTimes = line.flatMap(char => s"$char" * k) // each char is repeated k times
   Array.fill(n)(repeatKTimes)
 }.mkString("\n")

首先将每行的每个字母复制k次,然后将每行复制v次

总结:

 def scale(xs: String, k: Int, n: Int): String = xs
 .split("\n")
 .flatMap { line =>
   val repeatKTimes = line.flatMap(char => s"$char" * k) // each char is repeated k times
   Array.fill(n)(repeatKTimes)
 }.mkString("\n")

在构建大字符串时,我建议使用,以避免使用普通字符串连接创建额外的垃圾

def scale(string: String, k: Int, v: Int): String = {
  import scala.collection.mutable.StringBuilder

  val textBuilder = new StringBuilder(capacity = string.length * k * v)
  val lineBuilder = new StringBuilder(capacity = k * 5)
  // The five above is just an stimated of how many characters there could be for a line on average.
  // The value does not have to be precise, but if it is just a little bit bigger than the real size, it would be more performant, without too much extra memory.
  // You can play with it.

  string.foreach {
    case '\n' =>
      val line = lineBuilder.append('\n').result()
      lineBuilder.clear()
      (0 until v).foreach { _ =>
        textBuilder.append(line)
      }

    case char =>
      (0 until k).foreach { _ =>
        lineBuilder.append(char)
      }
  }

  textBuilder.result()
}

scale("abcd\nefgh\nijkl\nmnop", 2, 3) 
res: String =
"""
aabbccdd
aabbccdd
aabbccdd
eeffgghh
eeffgghh
eeffgghh
iijjkkll
iijjkkll
iijjkkll
mmnnoopp
mmnnoopp
mmnnoopp
"""

注意:Pamu的答案也在幕后使用StringBuilders,*和mkString都是根据它们实现的,因此这两个答案的性能应该或多或少相似。我的只是试图避免中间数组,但它使用了中间字符串生成器。

在构建大字符串时,我建议使用,以避免使用普通字符串连接产生额外的垃圾

def scale(string: String, k: Int, v: Int): String = {
  import scala.collection.mutable.StringBuilder

  val textBuilder = new StringBuilder(capacity = string.length * k * v)
  val lineBuilder = new StringBuilder(capacity = k * 5)
  // The five above is just an stimated of how many characters there could be for a line on average.
  // The value does not have to be precise, but if it is just a little bit bigger than the real size, it would be more performant, without too much extra memory.
  // You can play with it.

  string.foreach {
    case '\n' =>
      val line = lineBuilder.append('\n').result()
      lineBuilder.clear()
      (0 until v).foreach { _ =>
        textBuilder.append(line)
      }

    case char =>
      (0 until k).foreach { _ =>
        lineBuilder.append(char)
      }
  }

  textBuilder.result()
}

scale("abcd\nefgh\nijkl\nmnop", 2, 3) 
res: String =
"""
aabbccdd
aabbccdd
aabbccdd
eeffgghh
eeffgghh
eeffgghh
iijjkkll
iijjkkll
iijjkkll
mmnnoopp
mmnnoopp
mmnnoopp
"""
注意:Pamu的答案也在幕后使用StringBuilders,*和mkString都是根据它们实现的,因此这两个答案的性能应该或多或少相似。我的只是试图避免中间数组,但它使用了中间StringBuilder