在Java中,我需要检查给定的字符串是偶数还是奇数。
即使一个字符串也将具有相等数量的字符(HHEEPPDIDI,LLLQQMQMM,...) 奇数字符串的字符数不相等(HRTRDFF,HIYUDHDA等)
我尝试计算每个字符的出现次数,然后将该值放入一个INT变量,然后比较INT变量的值。但这看起来不像是有效的代码。
int frequency = 0;
for(int i = 0; i < str.length(); i++) {
if(ch == str.charAt(i)) {
++frequency;
}
像这样,我们可以计算每个字符并比较它们的值。。但是我想知道是否还有其他简单方法,或者我们可以使用任何内置方法来实现它。我们最多可以使用Java 8版本。 任何对此的帮助将不胜感激。
答案 0 :(得分:0)
您可以迭代输入字符串,并将char
的{{1}}加到计数器增加的数据结构(char
)中。
HashMap
输出:
import java.util.HashMap;
public class A02 {
public static void main(String[] args) {
System.out.println(new A02().new Solution().check("HHEEPPDIDI"));
System.out.println(new A02().new Solution().check("HHEEPPDID"));
System.out.println(new A02().new Solution().check("HRTRDFF"));
}
class Solution
{
HashMap<Character,Integer> hm = new HashMap<>();
public String check(String s)
{
for(int i=0;i<s.length();i++)
{
if(hm.get(s.charAt(i))==null)
{
hm.put(s.charAt(i), 1);
}
else
{
hm.put(s.charAt(i),hm.get(s.charAt(i))+1);
}
}
int first = 0;
for(Character c : hm.keySet())
{
if(first==0) first=hm.get(c);
if(first !=hm.get(c)) return "odd:"+s;
}
return "even:"+s;
}
}
}
even:HHEEPPDIDI
odd:HHEEPPDID
关于时间的最佳算法不是必需的,但仍然可能有用。 (可能会基于以下想法进行进一步优化:如果找到两个具有不同计数器的字符,那很奇怪)
Java 8更新
odd:HRTRDFF
用于空输入的输出:
public String check(String s)
{
//place the string into a map by chars with counter
Map<Integer,Long> map =
s.chars().boxed().collect(Collectors.groupingBy(t -> t, Collectors.counting()));
//check map by value - if values are the same then even and map size=1
int size =
map.values().stream().collect(Collectors.groupingBy(t -> t)).keySet().size();
if(size==1 || size==0) return "even:"+s;
return "odd:"+s;
}
答案 1 :(得分:0)
因此在Java 8或更高版本中,是否有任何字符串API方法 将简化要求。
如果愿意,在Java 8及更高版本中,可以使用流API,首先用于构造计数图(在Java 9中从{{1}开始),其次用于确定映射是否包含不同的计数。您是否认为它更简单可能更多取决于口味(我可能会认为它更高级,并且喜欢它)。
您可以搜索网络和Stack Overflow以获取详细信息。如果您遇到困难,请发布新问题,我们将为您提供帮助。
编辑:我认为到目前为止您已经有时间编写自己的代码,因此我将发布我的代码供您比较,如果您愿意的话,而不会浪费您的乐趣和学识
str.chars()
让我们尝试一下:
public static boolean isEven(String s) {
if (s.isEmpty()) {
return true;
}
Map<Integer, Long> counts = s.chars()
.boxed()
.collect(Collectors.groupingBy(ch -> ch, Collectors.counting()));
Long someCount = counts.values().iterator().next();
return counts.values()
.stream()
.allMatch(someCount::equals);
}
输出为:
for (String s : new String[] { // Even strings "FFHHIIJJ", "UUURROOOR", "HHEEPPDIDI", "LLLQQMQMM", "abaccb", "abc", "d", "", // Odd strings "IIREELO", "PPGIUUUUS", "HRTRDFF", "HIYUDHDA", "abbc", "aabcc" }) { System.out.format("%-11s %b%n", s, isEven(s)); }