【问题标题】:Removing duplicate digits in an integer [closed]删除整数中的重复数字[关闭]
【发布时间】:2014-10-03 13:40:20
【问题描述】:

我在技术回合中遇到过这个程序。他们给了我这个程序来删除给定整数中的重复数字不使用数组或字符串

例子:

int i = 123134254;

预期输出:12345

【问题讨论】:

  • 这个问题似乎跑题了,因为它是关于面试问题的
  • @JeanneBoyarsky 为什么会离题?
  • 把它标记为离题,我认为最合适的原因是“缺乏努力”。如果有人发布了一个面试问题并展示了他试图解决问题的努力,那就是 IMO 的主题。这是一个面试问题这一事实并没有使其偏离主题。
  • 我同意“缺乏努力”是一个更好的理由。我反对“这是问题;答案是什么”的格式。
  • @user3691208 可以使用收藏吗?

标签: java arrays int


【解决方案1】:

您可以使用int 作为集合来存储您已经遇到的数字,方法是将每个数字 (0,1,2,...,9) 分配给上述int 的一部分。然后,您可以遍历 i 的数字,并通过查阅此集合来构建一个新的唯一数字。请注意,我首先颠倒了i 的数字,这样我就可以轻松地按顺序遍历它们:

int i = 123134254;
int res = 0;  // result

int set = 0;  // digits we've seen
int rev = 0;  // digits of `i` reversed

while (i > 0) {
    rev = (rev * 10) + (i % 10);
    i /= 10;
}

while (rev > 0) {
    final int mod = rev % 10;
    final int mask = 1 << mod;
    if ((set & mask) == 0) {
        res = (res * 10) + mod;
        set |= mask;
    }
    rev /= 10;
}

System.out.println(res);
12345

【讨论】:

  • 是的,我已经看到了使用按位运算的有趣的技巧
  • +1 用于避免使用集合。
【解决方案2】:

您可以使用 %/ 运算符提取 i 的数字。

d0 = i % 10 是 LSB 数字
d1 = ((i - d0) / 10) % 10 是第二个数字
... 等等。

这将为您提供从右到左的所有数字。

由于不允许将它们放入数组中,所以让我们将它们放入堆栈中(希望这是允许的)。这将允许您从左到右从堆栈中弹出它们。

对于您从 Stach 弹出的每个数字,将其存储在一组重复项中,并且仅当它不在该组中时,才将其输出。

现在,要创建输出 int,每次输出一个数字时,您都会以这种方式修改输出:

output = output * 10 + digit;

【讨论】:

    【解决方案3】:

    1:反转数字
    2:按 1 得到最后一位 1
    3:用答案中的所有数字检查这个数字
    4:如果没有发现重复添加到答案中

    int i = 123134254;
    int copy = 0;
    while (i > 0) {
        copy = (copy * 10) + (i % 10);
        i /= 10;
    }
    int dig = copy % 10;
    int ans = dig;
    copy /= 10;
    while (copy > 0) {
        boolean flag = false;
        dig = copy % 10;
        long copy2 = ans;
        while (copy2 > 0) {
            if (copy2 % 10 == dig) {
                flag = true;
                break;
            }
            copy2 /= 10;
        }
        if (!flag) {
            ans = ans * 10 + dig;
        }
        copy /= 10;
    }
    System.out.println(ans);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-08
      • 1970-01-01
      • 2014-01-21
      • 2013-06-21
      • 1970-01-01
      • 2012-12-04
      • 1970-01-01
      • 2021-11-27
      相关资源
      最近更新 更多