晚上好,
我被要求写下一个代码,通过给出2个排序的字符串数组,返回两个arryas中出现的字符串数。
此代码的解决方案必须是线性的,这意味着我必须只遍历每个数组一次。否则,我们可以将每个字符串comapre到其他数组中的所有字符串。
例如:
sharedStr({ “呼叫”, “我”, “实玛利”},{ “呼叫”, “我”, “Jonha”}) - > 2
我想帮助您理解包含字符串的排序数组是什么意思?它没有任何特殊的描述方式。什么是字符串的基本普通排序?
如何比较两个字符串之间的任何方式?这是一个编译器错误。 (我正在使用eclipse。我注意到可以自动比较字符。)
谢谢你们。
答案 0 :(得分:4)
包含字符串的排序数组是什么意思?对它的排序方式没有任何特殊描述。什么是字符串的基本普通排序?
这意味着数组中的元素按自然顺序排序。对于字符串,这是alphebetical顺序,小写单词放在大写字母之前。
如何在两个字符串之间进行比较?
通过调用compareTo
方法。如果它返回0,则它们的字符串相等,如果返回< 0,第一个字符串低于第二个字符串,如果返回> 0第一个字符串高于第二个字符串。
至于如何线性计算重复次数,请参阅:comparing strings in java
答案 1 :(得分:2)
.equals()
(对于布尔值)或.compareTo()
(对于关系比较)比较对象(不是对象引用)例如:
String a = "Hello";
a.equals("Hello"); // true
String b = "Not hi";
b.equals(a); // false
小心不小心使用==
- 对于常量字符串,由于VM设计,它实际上可能说两个字符串相等,因为它们实际上是同一个对象。
答案 2 :(得分:2)
int x = 0;
int i= 0;
int j = 0;
while(i != list1.length && j != list2.length){
int v = list1[i].compareTo(list2[j]);
if (v == 0){
x++;i++;j++;
}else if (v < 0){
i++;
} else {
j++;
}
}
return x;
这使得直截了当地假设字符串是使用String.compareTo排序的,这是有意义的。
答案 3 :(得分:1)
如果没有说明排序的含义,那么它可能表明字符串的自然顺序是词典 - from the JavaDoc for the appropriate function to compare two Strings - compareTo()
,字典排序的定义被复制并粘贴在下面。
请注意,使用compareTo()
与使用equals()
方法(而不是==
运算符完成的两个字符串的相等不同不检查'有意义的'相等,只检查参照相等);另一方面,compareTo
会告诉你两个字符串之间的相对顺序是什么,即它们是相等的(返回值为0)还是一个先于另一个字符串?):
这是定义 词典排序。如果两个字符串 是不同的,然后他们要么 某些索引处的不同字符 这是两者的有效索引 字符串,或它们的长度 不同或两者兼而有之。如果他们有 一个或多个不同的字符 索引位置,让k为最小 这样的指数;然后是其中的字符串 位置k处的字符具有 通过使用确定的较小值 &lt;运算符,按字典顺序排列 在另一个字符串之前。在这 case,compareTo返回差异 中的两个字符值 在两个字符串中的位置k - 那个 是,值:
this.charAt(k)-anotherString.charAt(k)
如果没有索引位置 它们不同,然后是较短的字符串 按字典顺序排在较长时间之前 串。在这种情况下,compareTo 返回长度的差异 字符串 - 即值:
this.length()-anotherString.length()
这实际上意味着他们首先按字母顺序排列较小的字符串,就像在字典中一样。
答案 4 :(得分:1)
首先,问题的第二部分:
比较Java中的字符串并不像以下那么简单:
if(sStringOne == sStringTwo)
//Equal
您应该使用字符串类
的方法if(sStringOne.equals(sStringTwo)
// Equal
其次,问题的第一部分:
是的,循环遍历第一个数组并计算第二个数组中每个索引的出现都很容易。由于您已指定每个数组必须只迭代一次,因此可能适合以下算法:
答案 5 :(得分:1)
假设在输入sharedStr
算法之前对两个列表进行了排序。你想要保留两个引用:每个引用都在两个列表中的每个列表中。
然后你开始比较元素之后的元素并相应地推进其中一个或两个引用。这是一个伪代码:
def sharedStr(lista, listb):
indexa = indexb = 0
shared = 0
while 1:
try:
a = lista[indexa]
b = listb[indexb]
except IndexError: # we fell off one of the lists
break
if a == b:
shared += 1
indexa += 1
indexb += 1
elif a < b:
indexa += 1
else: # b < a
indexb += 1
return shared
是的,这也是一个有效的Python代码。 ; - )
答案 6 :(得分:0)
因为数组已经排序,所以你可以逐步了解它们,知道你是按顺序行走的。
import java.util.List;
import java.util.LinkedList;
class StringTest {
static List<String> sharedStrings(String[] a, String[] b) {
List<String> result = new LinkedList<String>();
int apos = 0;
int bpos = 0;
while(!(apos == a.length || bpos == b.length)) {
int comp = a[apos].compareTo(b[bpos]);
if(comp == 0) result.add(a[apos++]);
else if(comp > 0) bpos++;
else apos++;
}
return result;
}
public static void main(String[] args) {
String[] a = new String[]{"this","is","a","test"};
String[] b = new String[]{"test","for","a","party"};
java.util.Arrays.sort(a);
java.util.Arrays.sort(b);
List<String> result = sharedStrings(a,b);
for(String s : result) System.out.println(s);
}
}
答案 7 :(得分:0)
对数组进行排序的事实是一个红色的鲱鱼,它与解决方案无关。 使用Map&lt; String,Integer&gt; 步骤进行: