既是3的倍数又是5的倍数都有哪些
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了既是3的倍数又是5的倍数都有哪些相关的知识,希望对你有一定的参考价值。
参考技术A 既是3的倍数又是5的倍数有无数个,比如:15、30、45、60、75、90、105等等等等。如果不加范围,只要符合3、5的倍数的特征的数,都是3和5的倍数,最小是15。3、5的倍数的特征:个位上是0或5的数,各个数位上的数字相加之和是3的倍数。
3的倍数:一个数的各位数之和是3的倍数,这个数就是3的倍数。
5的倍数:一个数的末尾是0或5,这个数就是5的倍数。
一个整数能够被另一个整数整除,这个整数就是另一整数的倍数。同样的,一个数除以另一数所得的商。如a/b=c,就是说,a是b的倍数。一个数的倍数有无数个,也就是说一个数的倍数的集合为无限集。需要注意的是,不能把一个数单独叫做倍数,只能说一个数是另一个数的倍数。
如何在arraylist中找到相同整数的倍数?
【中文标题】如何在arraylist中找到相同整数的倍数?【英文标题】:How to find multiples of the same integer in an arraylist? 【发布时间】:2011-02-14 00:51:26 【问题描述】:我的问题如下。我有一个整数数组列表。数组列表包含 5 个整数,例如 [5,5,3,3,9] 或 [2,2,2,2,7]。许多数组列表都有重复的值,我不确定如何计算每个值存在多少。
问题是如何在数组列表中找到重复值并计算该特定重复值的数量。在第一个示例 [5,5,3,3,9] 中,有 2 个 5 和 2 个 3。 [2,2,2,2,7] 的第二个例子只有 4 个 2。我希望找到的结果信息是是否有任何重复项,其中有多少个以及已重复的特定整数。
我不太清楚如何在 java 中做到这一点。
任何帮助将不胜感激。谢谢。
【问题讨论】:
【参考方案1】:两种算法浮现在脑海中。
排序 (Collections.sort
)。然后遍历轻松找到骗子。
通过将计数保持在Map<Integer,Integer>
(或Map<Integer,AtomicInteger>
用于可变计数)中进行迭代。这样有点难看。
无论哪种方式,编码都应该是一个有启发性的练习。我建议两者都做,然后进行比较。
【讨论】:
#2 的变体:迭代一次以使用(在示例中)[5, 0], [3, 0], [9, 0] 填充地图;然后第二次通过以获得计数。我发现这个逻辑比在每个点检查值是否已经是地图的键更简单。 那条评论听起来很像。我以前从未使用过地图,所以不知道该怎么做 这是我去“为什么不能像 Python 一样”的时候之一...... defaultdict 在这里可以完美地工作。 :) @Danmap.put(key, value);
插入一个值。 Integer value = map.get(key);
检索一个值(如果键未映射,则为 null
。使用 Map<Integer,Integer> map = new HashMap<Integer,Integer>();
创建。这就是您所需要的。@Dav 也许在 Google 的收藏中有些东西(或者也许不值得考虑(在 Java 中))。ConcurrentMap.putIfAbsent
会让事情变得更干净,如果更晦涩的话。【参考方案2】:
使用Hashmap集合除了数组列表所在
Hashmap 键是唯一的数组 int 值和 键的 Hashmap 值是遇到的每个值的计数。遍历您的数组列表,将这些值收集到哈希图中,当先前的键不存在时添加一个新项目,并将已经存在的键的值增加 1。然后遍历 Hashmap 并打印出任何值大于 1 的键。
【讨论】:
【参考方案3】:您可以通过List
并将它们放入带有计数的Map
中。然后很容易找出哪个是重复的。
【讨论】:
我以前从未在 java 中使用过 Maps,知道我会怎么做吗?干杯。【参考方案4】:为了更清晰地抽象出您正在做的事情,您可以使用来自guava/google-collections 的Multiset 数据结构。你甚至可能会发现你宁愿使用它而不是List
,这取决于你用它做什么(如果你不需要列表的确定性排序)。你会这样使用它:
Multiset<Integer> multiset = HashMultiset.create(list);
int count = multiset.count(3); // gets the number of 3s that were in the list
就上述内容而言,这几乎完全等同于根据您的列表构建Map<Integer,AtomicInteger>
的建议。
【讨论】:
【参考方案5】:这是我在 cmets 中对@Tom 的回答所描述的具体实现和测试:
package playground.tests;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import junit.framework.TestCase;
public class DupeCounterTest extends TestCase
public void testCountDupes() throws Exception
int[] array = new int[] 5, 5, 3, 3, 9 ;
assertEquals("3=2, 5=2", countDupes(array).toString());
private Map<Integer, AtomicInteger> countDupes(int[] array)
Map<Integer, AtomicInteger> map = new HashMap<Integer, AtomicInteger>();
// first create an entry in the map for every value in the array
for (int i : array)
map.put(i, new AtomicInteger());
// now count all occurrences
for (int i : array)
map.get(i).addAndGet(1);
// now get rid of those where no duplicate exists
HashSet<Integer> discards = new HashSet<Integer>();
for (Integer i : map.keySet())
if (map.get(i).get() == 1)
discards.add(i);
for (Integer i : discards)
map.remove(i);
return map;
【讨论】:
太棒了! :-) 稍作调整会有很大帮助!【参考方案6】:对我来说,最直接的答案是使用Collections.frequency
方法。类似这样的东西:
// Example ArrayList with Integer values
ArrayList<Integer> intList = new ArrayList<Integer>();
intList.add(2);
intList.add(2);
intList.add(2);
intList.add(2);
intList.add(7);
Set<Integer> noDupes = new HashSet<Integer>();
noDupes.addAll(intList); // Remove duplicates
for (Integer i : noDupes)
int occurrences = Collections.frequency(intList, i);
System.out.println(i + " occurs " + occurrences + " times.");
如果您愿意,您可以将每个 Integer
与其出现次数进行映射:
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Integer i : noDupes)
map.put(i, Collections.frequency(intList, i));
【讨论】:
你的第一个答案也很理想,刚刚试了一下,效果很好!谢谢! 这看起来是O(N^2)
,而O(N log N)
是基于比较的排序的上限。 O(N)
如果适用非基于比较的排序,则可能。以上是关于既是3的倍数又是5的倍数都有哪些的主要内容,如果未能解决你的问题,请参考以下文章
判断一个正整数是不是是3或者5的倍数。根据判断输出“仅是3的倍数”、“仅是5的倍数”、“既是3又是5的倍数”
写一个程序输出1到100这些数字。但是遇到数字为3的倍数的时候,输出“三”替代数字,为5的倍数用“五”代替,既是3的倍数又是5的倍数则输出“三五”。