当前位置: 首页 > 面试题库 >

在不使用…范围的情况下访问字符串的随机符文元素

巫马曜文
2023-03-14
问题内容

我最近问了这个问题,答案使我加深了理解,但他们并没有解决我遇到的实际问题。因此,我将尝试如下提出类似但不同的问题。

假设我要访问的随机rune元素string。一种方法是:

func RuneElement(str string, idx int) rune {
  var ret rune
  for i, c := range str {
    if i == idx {
      return c
    }
  }
  return ret // out of range -> proper handling is needed
}

如果我想多次调用该函数怎么办?我猜我在寻找什么,就像是一个运算符/函数str[i]返回byte),该函数将rune元素放在i第-th个位置。为什么可以使用for ... range但不能通过str.At(i)例如这样的功能来访问此元素?


问题答案:

stringGo中的值存储文本的UTF-8编码字节序列。这是已经做出的设计决定,不会改变。

如果要有效地rune从任意索引处获取a ,则必须对字节进行解码,对此您将无能为力(for ... range此解码将完成)。没有“捷径”。所选的表示形式并不提供此功能。

如果你必须这样做频繁/多少次,你应该改变你的输入,而不是使用string,但一个[]rune,因为它是一个切片,可以有效的索引。string在Go中不是[]runestring在Go中实际上是只读[]byte(UTF-8)。期。

如果您无法更改输入类型,则可以构建一个内部缓存,string将其映射为[]rune

var cache = map[string][]rune{}

func RuneAt(s string, idx int) rune {
    rs := cache[s]
    if rs == nil {
        rs = []rune(s)
        cache[s] = []rune(s)
    }
    if idx >= len(rs) {
        return 0
    }
    return rs[idx]
}

这取决于情况是否值得:如果RuneAt()使用一小套strings进行调用,则可以大大提高性能。如果传递的字符串或多或少是唯一的,这将导致性能下降和大量内存使用。同样,此实现对于同时使用也不安全。



 类似资料:
  • 问题内容: 如何将字符串中的字符随机播放(例如,hello可能是ehlol或lleoh或…)。我不想使用该方法,有没有更简单的方法? 问题答案: 我不知道更简单。但是您可以使用Math.rand()功能生成字符长度范围内的随机数,而无需替换,这将给您带来混乱的输出

  • 有没有办法从数组中选择一个随机字符串,而不再选择该字符串。所有字符串只拾取一次后,程序结束。 这是我当前的系统,publicstaticvoidmain(String[]argv){ 我的问题是,控制台将返回“此人已被选中”等等。并不是说节目结束系统不起作用,因为Rest会过早地起作用。 [1]: https://i.stack.imgur.com/54Eef.png [如您所见,程序结束,尽管没

  • 问题内容: 我需要在检查的同时将以下更改为- ,以改善圈复杂度。 但是我不确定我将获得什么价值。 问题答案: Java(版本7之前的版本)在switch / case中不支持String。但是您可以通过使用枚举来达到预期的结果。

  • 为什么它抛出一个错误?任何帮助都将不胜感激 编辑:

  • 问题内容: 如何在不先进行大小检查(内联是可以接受的)或冒冒号危险的情况下,获取Java中字符串的第一个字符? 问题答案: 这是一个整洁的解决方案: 意见:虽然此解决方案“精巧”,但我认为它实际上比使用/ 以明显方式使用/ 的解决方案 可读性 差。如果读者没有看到此技巧,则他/她必须 更加努力 地理解代码。IMO,代码的含义在/ 版本中更加明显。有关更清洁/更易读的解决方案,请参见@paxdiab

  • 问题内容: 我在何时遇到oracle的问题。 该查询始终返回null,尽管很明显结果应该是第一种情况。我是否缺少有关oracle中字符串比较的内容? 问题答案: 您要再次检查字符串和一个空字符串,从而出现问题;在Oracle中,您最好检查一下您的字符串: 关于Oracle处理空字符串和空值的方式,在这里您可以找到更多信息 一个例子: 给出: 简而言之,谈论时,您可以依靠的唯一支票是: