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

迭代边界与数据类型的相同

袁帅
2023-03-14
问题内容

我拥有的函数采用 minmax uint16参数,并在某些时候迭代数字范围。但是,如果 max 恰好是 2 ^ 16-1
(这是一个有效的用例),则溢出会破坏循环逻辑。这是示例代码,演示了以下问题uint8

package main

import "fmt"

func iter(min, max uint8) {
    for i := min; i <= max; i++ {
        fmt.Printf("%d, ", i)
    }
}

func main() {
    iter(0, 255)
}

如您所见,该程序永远不会结束。在另一个问题上也提出了类似的问题,但是解决方案恰好显示出我遇到的相同问题。

我现在的想法是将循环变量转换为uint32,类似于:

package main

import "fmt"

func iter(min, max uint8) {
    for i := uint16(min); i <= uint16(max); i++ {
        fmt.Printf("%d, ", i)
    }
}

func main() {
    iter(0, 255)
}

但是,这似乎是一个笨拙的解决方案,不适用于uint64任何大型uintN类型的解决方案。感觉像我缺少一些非常基本的东西。指导?

我知道Brad
Fitz的Iter解决方案
,但这似乎增加了不必要的开销。那是真的吗?


问题答案:

例如,对于uint8

package main

import "fmt"

func iter(min, max uint8) {
    {
        min, max := uint(min), uint(max)
        for i := min; i <= max; i++ {
            fmt.Printf("%d, ", i)
        }
    }
}

func main() {
    iter(0, 255)
}

对于uint64

package main

import "fmt"

func iter(min, max uint64) {
    for i := min; i <= max; i++ {
        fmt.Printf("%d, ", i)
        if i == max {
            break
        }
    }
}

func main() {
    iter(^uint64(0)-2, ^uint64(0))
}

输出:

18446744073709551613, 18446744073709551614, 18446744073709551615

附录

这是我对DaveC的建议。

package main

import "fmt"

func iter(min, max uint64) {
    for i, next := min, min <= max; next; i, next = i+1, i < max {
        fmt.Printf("%#016[1]x ", i)
    }
    fmt.Println()
}

func main() {
    const maxUint64 = ^uint64(0)
    iter(0, 3)
    iter(10, 9)
    iter(maxUint64-2, maxUint64)
}

输出:

0x0000000000000000 0x0000000000000001 0x0000000000000002 0x0000000000000003 
0xfffffffffffffffd 0xfffffffffffffffe 0xffffffffffffffff


 类似资料:
  • 问题内容: 以下两个签名是否相同? 和 问题答案: 不,两个签名不相同。根据Java语言规范的第8章: 如果两个方法具有相同的名称和参数类型,则它们具有相同的签名。 如果满足以下所有条件,则两个方法或构造函数声明M和N具有相同的参数类型: 它们具有相同数量的形式参数(可能为零) 它们具有相同数量的类型参数 (可能为零) … 由于两种方法共享的类型参数数量不同,因此签名也不相同。 在实际情况下,使用

  • JavaScript中有没有已知的技巧来区分和之间的区别,而不触发迭代? 我正在尝试实现以下类型检查器: 我知道调用会告诉我们这一点,但在无法触发迭代时我需要它。 此外,即使我在TypeScript中给出了示例,我也需要在运行时严格检查它。

  • 使用递归的DFS将节点标记为未访问、已发现或已完成(或白、灰、黑),可以根据三类(后边缘、树/前边缘、交叉边缘)对边缘进行分类。 我们是否也可以使用算法的迭代版本(参照深度优先搜索)对边缘进行分类?

  • 我的一个朋友在Java API中发现了这条新闻(https://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html), 通过阅读以下文章https://docs.oracle.com/javase/tutorial/java/generics/genTypes.html我可以理解前面提到的这一行在语法上意味着什么,但从给出的示例中,我无法找出

  • 编译以下Java代码: 此外,编译以下代码: 以下代码将给我一个编译错误: 因此,看起来,如果其中一个边界类型本身是类型参数,就不可能有多个边界。但为什么呢? 据我所知,如果声明了多个边界,那么最多一个边界可能是一个类(其他所有边界都是接口),并且它必须是第一个边界。 但是,既然在我的示例中是一个接口,为什么编译器会抱怨呢?毕竟,T是接口还是类应该没有任何区别。 我试图在网上找到答案,但显然我的谷

  • 最常见的类型包括容器类(container class),也称集合类(collection class),是保存一组对象集合的类。容器类通常提供插入、删除、查找、排序和测试类成员项目等操作。数组、堆栈、队列、树和链表都是容器类,第4章介绍了数组,第11章和20章将介绍其他数据结构。 容器类经常与迭代对象(iterator object;或简称迭代器,aerator)相关联。迭代对象返回集合中的下一