我一般写
for (int i = 0, n = someMethod(); i < n; i++)
Run Code Online (Sandbox Code Playgroud)
优先于
for (int i = 0; i < someMethod(); i++)
Run Code Online (Sandbox Code Playgroud)
避免someMethod() 重复计算.但是我不确定我什么时候需要这样做.Java在识别每次都会给出相同结果的方法时有多聪明,只需要在循环开始时执行一次?
我想使用一个,List<E>但我唯一要使用的方法是
E remove(int index)
Run Code Online (Sandbox Code Playgroud)
我对此方法(已E删除)的返回值感兴趣。我永远不需要这种方法remove(E e)。
我唯一需要的构造函数是一个Collection<? extends E>。
如果List为ArrayList,则该remove(int index)方法具有时间复杂度O(n),因为您必须在将删除的元素向左移一个位置之后对元素进行随机排序。
如果List为a LinkedList,则该remove(int index)方法也具有时间复杂度O(n),因为尽管花费O(1)的时间来更改元素上的链接,但是您必须index通过遍历来找到索引处的元素List。
如果我只对使用该remove(int index)方法感兴趣,是否可以编写List<E>针对该方法优化的实现,以使该remove(int index)方法的时间复杂度优于O(n)?
在Effective Java的第140页,我们被告知带有通配符的方法签名优于具有仅出现一次的类型参数的方法签名.例如,
public static void swap(List<?> list, int i, int j)
Run Code Online (Sandbox Code Playgroud)
比较好
public static <T> void swap(List<T> list, int i, int j)
Run Code Online (Sandbox Code Playgroud)
但是,不可能将a的项设置List<?>为任何内容(除外null),因此有效的Java建议编写一个私有帮助器方法来使用通配符工作进行签名.
private static <T> void swapHelper(List<T> list, int i, int j) {
list.set(i, list.set(j, list.get(i)));
}
public static void swap(List<?> list, int i, int j) {
swapHelper(list, i, j);
}
Run Code Online (Sandbox Code Playgroud)
但是我查看了源代码Collections.swap并发现他们解决List<?>问题的方法是使用原始类型.
public static void swap(List<?> list, int i, int j) {
final List l = list;
l.set(i, l.set(j, …Run Code Online (Sandbox Code Playgroud) 这是最近一次编程采访中提出的一个问题.
给定一个随机字符串S和另一个具有唯一元素的字符串T,找到S的最小连续子字符串,使其包含T中的所有元素.Sa,
S='adobecodebanc'
T='abc'
Answer='banc'
Run Code Online (Sandbox Code Playgroud)
我想出了一个解决方案,
public static String completeSubstring(String T, String S){
String minSub = T;
StringBuilder sb = new StringBuilder();
for (int i = 0; i <T.length()-1; i++) {
for (int j = i + 1; j <= T.length() ; j++) {
String sub = T.substring(i,j);
if(stringContains(sub, S)){
if(sub.length() < minSub.length()) minSub = sub;
}
}
}
return minSub;
}
private static boolean stringContains(String t, String s){
//if(t.length() <= s.length()) return false;
int[] arr = new int[256];
for …Run Code Online (Sandbox Code Playgroud) 在以下Java代码中:
int max = arr[0];
for (int i = 0; i < arr.length i++) {
if (arr[i] > max) {
max = arr[i];
}
}
Run Code Online (Sandbox Code Playgroud)
max = arr[i];假设数组未排序,该行运行多少次。
假设我想为多维数组中的每个数字做一些事情.我发现你可以获得第一个数字的指针然后使用use pointer添加.例如,以下代码1通过以下方式打印数字12:
double a[2][3][2] = {{{1, 2}, {3, 4}, {5, 6}}, {{7, 8}, {9, 10}, {11, 12}}};
double *p = &a[0][0][0];
for (int i = 0; i < 12; i++)
cout << *(p + i) << endl;
Run Code Online (Sandbox Code Playgroud)
以这种方式考虑多维阵列是否平坦是不通常的吗?如果是这样,这样做的首选方式是什么?另外,有一种更简单的方法来编写double *p = &a[0][0][0];多维数组中第一个数字的指针(就像你只能double *p = a;为一维数组编写一样)吗?
为什么以下程序打印错误,我必须做出哪些更改才能使其打印为true?
public class Main {
static int[] codePoints(String s) {
int n = s.length();
int[] temp = new int[n];
for (int i = 0; i < n; i++)
temp[i] = s.codePointAt(i);
return temp;
}
static String construct(int[] codePoints) {
StringBuilder sb = new StringBuilder();
for (int i : codePoints)
sb.appendCodePoint(i);
return sb.toString();
}
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("The symbol ");
sb.appendCodePoint(Character.MAX_VALUE + 1);
sb.append(" is not in the Basic Multilingual Plane.");
String s = …Run Code Online (Sandbox Code Playgroud) 我的应用程序有两个活动 A 和 B。A 是任务的根,并且是从启动图标启动的那个。B 可以从 A 开始。
除了从启动图标启动 A 之外,还可以通过单击另一个应用程序中的文件来启动 A,例如单击电子邮件附件或 Drive 中的文件。我通过向清单文件中的意图过滤器添加操作和类别来完成此操作。
我想让它在从另一个应用程序启动 A 时,而不是创建一个新任务,我希望现有任务恢复到与之前相同的状态。这可能是活动 A 或 B,无论用户在他们按下家之前碰巧在哪里。
我尝试了各种启动模式和意图标志,但似乎没有任何效果。