我正在解决一个问题,该问题要求我打印一个整数数组中的所有数字,其中包含 1、2、3。例如,包含 [123,300, 456,789] 的数组 a 将给出输出 [123,300]。 在我的代码中,我使用了 ArrayList 和解决它所需的所有那些东西。仍然评估时间不达标。
public static void take(int[] a)
{
ArrayList<Integer> ai = new ArrayList<>();
for(int i=0; i<a.length;i++)
{
int temp =a[i];
while(a[i]>0)
{
int b=a[i]%10;
if(b==1||b==2||b==3)
{
ai.add(temp);
break;
}
a[i]= a[i]/10;
}
}
if(ai.isEmpty())
{
System.out.println(-1);
}
else
{
ai.sort(null);
System.out.println(ai);
}
}
public static void main(String[] args)
{
Scanner mew = new Scanner(System.in);
int t=mew.nextInt();
for(int i=0; i<t;i++)
{
int n=mew.nextInt();
int a[] = new int[n];
for(int j=0; j<n;j++)
{
a[j] = mew.nextInt();
}
take(a);
}
}
最佳答案
您所需要的只是将数字
转换为字符串;使用 Set
检索所有字符并检查所需字符是否存在:
public static Set<Integer> take(int[] a, char[] markers) {
Set<Integer> numbers = new TreeSet<>();
for (int i = 0; i < a.length; i++) {
String str = String.valueOf(a[i]);
for (char marker : markers) {
if (str.contains(String.valueOf(marker))) {
numbers.add(a[i]);
break;
}
}
}
return numbers;
}
作为替代方案,您可以使用流:
public static Set<Integer> take(int[] a, char[] markers) {
return Arrays.stream(a)
.boxed()
.filter(val -> {
String str = String.valueOf(val);
for (char marker : markers)
if (str.contains(String.valueOf(marker)))
return true;
return false;
})
.sorted()
.collect(Collectors.toSet());
}
关于java - 我如何优化此代码以减少评估时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50597910/