我需要编写一个以两个字符串作为输入的函数。一个是我要写的信息,第二个是给我的信。字母的顺序是随机的。不能保证每个字母出现的次数是相似的。有些字母可能会完全丢失。函数应该确定我是否可以用给定的字母写消息,并且它应该相应地返回true或false。
我编码了它,我认为它是非常快的,但我如何改进它,记住,带字母的字符串将是非常大的,而消息将是非常短的?
有最快的方法吗?
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class LetterBowl {
public static void main(String []args){
String message = generateRandomStringUpToThousandChars();
String bowlWithLetters = generateRandomStringUpToThousandChars();
if(canConstructMessage(message, bowlWithLetters)) {
System.out.println("Message '" + message + "' can be constructed with letters from bowl : " + bowlWithLetters);
}
}
public static boolean canConstructMessage(String message, String letters) {
Map<Character,Integer> letterMap = stringToCharacterMap(letters);
char[] messageList = stringToCharacterList(message);
for(char c : messageList) {
if (!containsLetterAndSubtract(c,letterMap))
return false;
}
return true;
}
// checks if map(bowl) contains char andsubtract one char from map(or removes it if it is last one)
public static boolean containsLetterAndSubtract(char c, Map<Character,Integer> letterMap) {
if(letterMap.containsKey(c)) {
if(letterMap.get(c) > 1) {
letterMap.put(c, letterMap.get(c) - 1);
} else {
letterMap.remove(c);
}
return true;
}
return false;
}
public static char[] stringToCharacterList(String message) {
return message.replaceAll(" ", "").toCharArray();
}
public static Map<Character,Integer> stringToCharacterMap(String s) {
Map<Character,Integer> map = new HashMap<Character,Integer>();
for (char c : s.toCharArray()) {
if(map.containsKey(c))
map.put(c, map.get(c) + 1);
else
map.put(c, 1);
}
return map;
}
public static String generateRandomStringUpToThousandChars(){
char[] chars = "abcdefghijklmnopqrstuvwxyz".toCharArray();
StringBuilder sb = new StringBuilder();
Random random = new Random();
for (int i = 0; i < random.nextInt(1000); i++) {
char c = chars[random.nextInt(chars.length)];
sb.append(c);
}
String output = sb.toString();
return output;
};
}
对于大碗大小和较小的味精大小,我发现这将是非常有效的:
公共静态布尔canConstructMessageSorted(String message,String bowlWithLetters){int counter=0;布尔HasLetter;
//sorting
char[] chars = bowlWithLetters.toCharArray();
Arrays.sort(chars);
String sortedBowl = new String(chars);
//sorting
chars = message.toCharArray();
Arrays.sort(chars);
String sortedMsg = new String(chars);
for (int i = 0; i < sortedMsg.length(); i++) {
hasLetter = false;
for( ; counter < sortedBowl.length() ; counter++) {
if(sortedMsg.charAt(i) == sortedBowl.charAt(counter)) {
hasLetter = true;
break;
}
}
if(!hasLetter) return false;
}
return true;
}
您的操作为O(消息大小+字母大小)。这是我手头能算出的最低最坏情况下的时间复杂度。提到最快的方法,总有更多的你可以做。例如,定义方法
public static char[] stringToCharacterList(String message)
而且只使用一次在技术上是没有时间效率的。您可以简单地将代码主体放在canConstructMessage()方法中,从而避免将另一个项放在堆栈上,并从堆栈中取出。虽然这是一小段时间,但当你说最快的时候,它可能是值得谈论的。
问题内容: 我正在传递一个accountid作为XML文件的输入,如图所示,稍后将对其进行解析并将在我们的代码中使用: 问题是,如果没有传递任何内容(accoutnid中的空值)作为accountid传递,我将无法在Java代码中处理这种情况。我尝试了这个,但是没有成功: 我可以使用以下方法成功解决此问题: 我们可以依靠该方法来检查a的空条件吗?这有效吗? 问题答案: 不,绝对不是-因为如果为nu
本文向大家介绍python检查指定文件是否存在的方法,包括了python检查指定文件是否存在的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python检查指定文件是否存在的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的Python程序设计有所帮助。
问题内容: 这是对该问题的后续跟踪 因此,首先,您会注意到无法对要连接的字符串列表执行,python告诉您改为使用,这是个好建议,因为无论您如何在字符串上使用,性能都很差。 “不能使用”限制不适用于,尽管这是执行这种列表平整的首选方法。 但是什么时候是列表绝对是不好的。 但是它应该保持这种状态吗? 我比较了三种方法 结果: 在清单清单上:10.46647310256958。好吧,我们知道。 :0.
我试图写一个方法来检查一个给定的单词是否是回文,但到现在为止它还不能工作。我怀疑错误出在if语句中,而且您没有将对象(如字符串)与==进行比较,而是与equals进行比较,对吗?但是Java不允许我写:if(firstthalf.charat(i).equals(secondhalf.charat(j))),那么我该怎么做才能使它工作呢?代码中还有其他错误吗? null null 提前道谢! /尼
本文向大家介绍编写Golang程序以检查给定数字是否为质数,包括了编写Golang程序以检查给定数字是否为质数的使用技巧和注意事项,需要的朋友参考一下 定义: 一个数字是大于2且只能被其自身和1整除。 示例:素 数是2、3、5、7、11、13、113、119等。 解决这个问题的方法 步骤1:找到给定数字的平方根sq_root =√num 步骤2:如果给定数字可被[2,sq_root]所属的数字整除
检查给定行是否为java代码的正确方法是什么? 输入:日志支持。java:44 com/sun/activation/registries/LogSupport日志(Ljava/lang/String;)五、 预期输出:false。 输入:扫描仪输入=新扫描仪(系统输入); 预期输出:true。 我尝试了EclipseJDTASTParser来检查是否可以创建AST。代码如下: 但这是行不通的。有