我在以下练习中遇到麻烦。
编写一个方法starString,它接受一个整数参数n并返回一个2n长(即2等于n次幂)的星号(星号)。例如:
Call Output Reason
starString(0); "*" 2^0 = 1
starString(1); "**" 2^1 = 2
starString(2); "****" 2^2 = 4
starString(3); "********" 2^3 = 8
starString(4); "****************" 2^4 = 16
如果传递的值小于0,则应引发IllegalArgumentException。
我已经尝试过了,但是我正在寻找一种将字符串“ *”相乘多次的方法。 PD:我不能使用.repeat
我一直坚持将2的值乘以n次方。正如我尝试过的
int x = (int)Math.pow(2,(n));
但是我不知道该怎么办。
public static String starString(int n) {
if(n<0){
throw new IllegalArgumentException("No negative values allowed");
}
if(n==0){
return "*";
}else{
return starString(0) + starString(n-1);
}
}
test #1:starString(0)
return:"*"
result: pass
test #2:starString(1)
return:"**"
result: pass
test #3:starString(2)
expected return:"****"
your return:"***"
result: fail
test #4:starString(3)
expected return:"********"
your return:"****"
result: fail
test #5:starString(4)
expected return:"****************"
your return:"*****"
result: fail
test #6:starString(-1)
exp. exception:IllegalArgumentException
your exception:IllegalArgumentException on line 3: No negative values allowed
result: pass
答案 0 :(得分:3)
这将起作用,尽管它会炸毁较大的n。
public static Page<TRet> PagedFetch<T1, T2, TRet>(this PetaPoco.IDatabase db, long page, long itemsPerPage, Func<T1, T2, TRet> cb, string sql, params object[] args)
{
SQLParts parts;
if (!db.Provider.PagingUtility.SplitSQL(sql, out parts))
throw new Exception("Unable to parse SQL statement for paged query");
db.Provider.BuildPageQuery((page - 1) * itemsPerPage, itemsPerPage, parts, ref args);
sql = string.Format("{0} offset {1} rows fetch next {2} rows only", sql, (page - 1) * itemsPerPage, itemsPerPage);
var data = db.Fetch(cb, sql, args);
var result = new Page<TRet>
{
Items = data,
TotalItems = db.ExecuteScalar<long>(parts.SqlCount),
CurrentPage = page,
ItemsPerPage = itemsPerPage
};
result.TotalPages = result.TotalItems / itemsPerPage;
if ((result.TotalItems % itemsPerPage) != 0)
result.TotalPages++;
return result;
}
很显然,您可以使用来获得2 ^ n
public static String starString(int n) {
if(n<0){
throw new IllegalArgumentException("No negative values allowed");
}
if(n==0){
return "*";
}else{
return starString(n-1) + starString(n-1);
}
}
答案 1 :(得分:0)
您可以这样做
public static void main(String[] args) {
int count = (int)Math.pow(2, 4);
System.out.println(count);
String value = starString(count);
System.out.println(value);
System.out.println(value.length());
}
static String starString(int n) {
String result = "";
if (n > 0) {
result = "*" + starString(n -1);
}
return result;
}
答案 2 :(得分:0)
尝试一下:
public static String starString(int n) {
if (n < 0) {
throw new IllegalArgumentException("No negative values allowed");
}
if (n == 0) {
return "*";
} else {
int pow = (int) Math.pow(2, n);
int pow2 = pow / 2;
int starsCount = pow - pow2;
StringBuilder stringBuilder = new StringBuilder();
IntStream.iterate(0, operand -> operand + 1)
.limit(starsCount)
.forEach(value -> stringBuilder.append("*"));
return stringBuilder.toString() + starString(n - 1);
}
}
在每个递归步骤中,我都要计算必须附加多少颗星星(pow - pow2)
。
答案 3 :(得分:0)
memoization是可以帮助完成昂贵的函数调用的一项重要优化。如果从零开始时包含一个星的表开始,然后在返回输出时填充该表,则不需要为每一步都重新计算输出。喜欢,
private static Map<Integer, String> memo = new HashMap<>();
static {
memo.put(0, "*");
}
public static String starString(int n) {
if (n < 0) {
throw new IllegalArgumentException("No negative values allowed");
} else if (!memo.containsKey(n)) {
final String pre = starString(n - 1);
StringBuilder sb = new StringBuilder(pre.length() * 2);
sb.append(pre).append(pre);
memo.put(n, sb.toString());
}
return memo.get(n);
}
然后您可以像这样打印每一行(并计算星星数)
public static void main(String[] args) {
for (int i = 0; i < 8; i++) {
String s = starString(i);
System.out.printf("%d: %s%n", s.length(), s);
}
}
哪个输出
1: *
2: **
4: ****
8: ********
16: ****************
32: ********************************
64: ****************************************************************
128: ********************************************************************************************************************************