路线:
给定int[] x
和百分比p(0 - 100),找到y
的最小值元素x
,以便至少p
个x
元素小于或等于y
。
Example 1:
x = {-3, -5, 2, 1}, p = 50
Method should return -3
Reason: 50% of the elements in x are less than or equal to -3: -5 and -3
Example 2:
x = {7, 9, 2, -10, -6}, p = 50
Method should return 2
Reason: 60 percent of the elements in x are less than or equal to 2: 2, -10 and -6
-6 would be wrong because only 40% of the elements are less than or equal
(100% of the elements are less than or equal to 9, but that isn't the smallest value)
Example 3:
x = {1,2,3,4,5,6,7,8,9,1,2,3,4,5,7,9,5,43,124,94}, p = 0
Method should return 1
Reason: Only 0% is needed, so in theory any number will do, but 1 is the smallest value
这是我到目前为止为该方法编写的内容:
public static int fractile(int[] x, int p)
{
int smallestInt = x[0];
for (int i = 0; i < x.length; i++) {
int testNum = x[i];
int percentage;
int count = 0;
for (int j = 0; j < x.length; j++) {
if (x[j] <= testNum)
count++;
}
percentage = (count / x.length) * 100;
if (testNum <= smallestInt && percentage >= p)
smallestInt = testNum;
}
return smallestInt;
}
但我的样本数字输出错误:
INPUT:
[6, 5, 4, 8, 3, 2]
40%
Method returns: 6
INPUT:
[7, 5, 6, 4, 3, 8, 7, 6, 9, 10]
20%
Method returns: 7
INPUT:
[3, 4, 2, 6, 7, 5, 4, 4, 3, 2]
60%
Method returns: 3
这几乎就好像它抓住了第一个索引并没有看到它背后的数字,但我无法弄清楚为什么。
我做错了什么?
答案 0 :(得分:3)
将您的百分比更改为double / float并将其中一个变量转换为double / float。
类似的东西:
double percentage=0.0;
...
percentage = ((double)count / x.length) * 100;
因此等式返回double / float。
-
原始类型的数字促销规则
如果两个值具有不同的数据类型,Java将自动将其中一个值提升为两种数据类型中较大的一种。
如果其中一个值是整数而另一个是浮点值,Java会自动将积分值提升为 浮点值的数据类型。
较小的数据类型,即byte,short和char,在与Java二进制算法一起使用时,首先被提升为int 运算符,即使两个操作数都不是int。
- 在所有促销发生并且操作数具有相同的数据类型之后,结果值将具有与其相同的数据类型 推广操作数。
醇>
作者:Jeanne Boyarsky&amp; Scott Selikoff - OCA学习指南
答案 1 :(得分:2)
在第
行@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
String path=data.getData().getPath();
//Here insert the path into database
}
count和x.length都是整数。因此,除以它们会产生整数值,而不是浮点数。百分比可能包含0或100,而不是一些值。
答案 2 :(得分:1)
答案 3 :(得分:1)
对于从最低到最高排序的数组,您只需将长度乘以百分比即可获得搜索元素的正确索引。有关更多信息Quantiles
会缩短你的代码
public static int fractile(int[] x, double p){
Arrays.sort(x);
int k = (int) Math.ceil(x.length*p)-1;
return x[k];
}
答案 4 :(得分:0)
你可以尝试:
public static int fractile( int[] x, int p )
{
Arrays.sort(x);
return x[Math.max((int) Math.ceil(x.length / 100.0 * p) - 1, 0)];
}
这假设您可以操作数组。对数组进行排序几乎总是使操作变得更容易。这将起作用,除非数组必须保持原样。
此代码对数组进行排序,因为初始输入&#39; p&#39;告诉您要查找的百分比,它会查看数组中的大致位置并返回存储在那里的值。
答案 5 :(得分:0)
我对该问题有另一种实现方式:
public static void main(String args[]){
int[] a1 = {-3,-5,2,1};
int[] a2 = {7,9,2,-10,-6};
int[] a3 = {1,2,3,4,5,6,7,8,9,10};
int[] a4 = {1,2,3,4,5,6,7,8,9,1,2,3,4,5,7,9,5,43,124,94};
int[] a5 = {1};
int p = 50;
System.out.println(fractile(a1, p));
}
private static int fractile(int[] x, int p) {
Arrays.sort(x);
double value0 = x.length / 100.0 * p;
double value1 = Math.ceil(value0);
int value2 = (int)value1;
int value3 = value2 - 1;
int value4 = Math.max(value3, 0);
return x[value4];
}