Java 这里有“字符串”;“naveen”,希望输出为;eennav“;
我有java“naveen”中的字符串,我希望输出为“eennav”。请帮我解决这个问题。其思想是字符按频率顺序排列,如果频率相同,则按字母顺序排列 谢谢 我试图在字符串中找到重复项,但无法获得所需的输出Java 这里有“字符串”;“naveen”,希望输出为;eennav“;,java,string,Java,String,我有java“naveen”中的字符串,我希望输出为“eennav”。请帮我解决这个问题。其思想是字符按频率顺序排列,如果频率相同,则按字母顺序排列 谢谢 我试图在字符串中找到重复项,但无法获得所需的输出 String str="naveen"; int count =0; char[] charr=str.toCharArray(); for(int i=0;i<charr.length;i++) { //System.out.printl
String str="naveen";
int count =0;
char[] charr=str.toCharArray();
for(int i=0;i<charr.length;i++) {
//System.out.println(s[i]);
for(int j=i+1;j<charr.length;j++) {
if(charr[i]==(charr[j])) {
System.out.println(charr[i]);
}
String str=“naveen”;
整数计数=0;
char[]charr=str.toCharArray();
对于(int i=0;i假设问题要求我们获取一个只包含小写字母的字符串,并按字母频率(从高到低)对其进行组织,在该频率范围内按字母顺序进行组织,我们可以如下所示。
策略是首先遍历输入字符串的字符并计算每个字符的出现次数。然后我们查看字母的出现次数并找到最大的。从最大到1,我们遍历出现次数最多的字符的字母表,并将其中的许多字符附加到结果字符串中。
这里需要做一点工作,将“a”来回转换为0,将“0”转换为“a”,然后依次转换为25和“z”。
这种方法可以扩展,但由于问题没有具体说明,我选择了简化假设。我也没有进行优化,只是让它发挥作用
public class MyClass {
public static void main(String args[]) {
String str = "naveen"; //this string may change, but it is assumed to be all lower case letters by this implementation
int[] counts = new int[26]; //frequency count of letters a to z
for (int i = 0; i < 26; i++) {
counts[i] = 0; // intially 0 of any letter
}
char[] charr = str.toCharArray();
for (int i = 0; i < charr.length; i++) {
counts[(int)(charr[i]) - (int)('a')]++; // increment corresponding spot in counts array, spot 0 for 'a' through 25 for 'z'
}
int maxCount = counts[0]; // now find the most occurrences of any letter
for (int i = 1; i < counts.length; i++) {
if (counts[i] > maxCount) {
maxCount = counts[i];
}
}
String result = ""; // string to return
for (int j = maxCount; j > 0; j--) { // work down from most frequently occuring, within that alphabetically
for (int i = 0; i < 26; i++) {
if (counts[i] == j) {
//System.out.println("there are "+j+" of the letter "+(char)((int)('a'+i)));
for (int k = 0; k < j; k++) {
result = result + (char)((int)('a' + i));
}
};
}
}
System.out.println(result);
}
}
公共类MyClass{
公共静态void main(字符串参数[]){
String str=“naveen”//此字符串可能会更改,但此实现假定它是所有小写字母
int[]计数=新的int[26];//字母a到z的频率计数
对于(int i=0;i<26;i++){
计数[i]=0;//任何字母的初始值为0
}
char[]charr=str.toCharArray();
for(int i=0;i最大计数){
最大计数=计数[i];
}
}
String result=“;//要返回的字符串
对于(int j=maxCount;j>0;j--){//从最常出现的开始,按字母顺序向下计算
对于(int i=0;i<26;i++){
如果(计数[i]==j){
//System.out.println(“字母“+(char)((int)('a'+i))中有“+j+”);
对于(int k=0;k
请解释你如何从一个词到另一个词的规则……是先按出现频率再按字母表排列字符的想法吗?@JeremyKahan……它也可以左移三次?naveen
到aveenn
到veenna
到eennav
如果(str.equals(“naveen”))System.out.println(“eennav”);else抛出新的IllegalArgumentException(“转换的一般规则未知”)
问题主要不在于重复。首先要建立一个频率表,并从高频率到低频率进行迭代。太好了。如果问题被搁置时允许,请随时接受答案。我希望我没有给你比你想要的更多。一个练习可以是扩展它以处理资本字母或者其他字符——让它成为你自己的。肯定还有其他可能的方法,比如先对字符进行排序。奇怪的是,由于不清楚,所以它被搁置了,因为有很多人确实理解了这个问题。