专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
一个整数可以由连续的自然数之和来表示给定一个整数,计算该整数有几种连续自然数之和的表达式,且打印出每种表达式。
二、输入描述
一个目标整数T(1<=T<=1000)
三、输出描述
该整数的所有表达式和表达式的个数。如果有多种表达式,输出要求为:
自然数个数最少的表达式优先输出
每个表达式中按自然数递增的顺序输出,具体的格式参见样例。
在每个测试数据结束时,输出一行”Result:X”,其中X是最终的表达式个数。
用例:
1、输入
9
2、输出
9=9
9=4+5
9=2+3+4
Result:3
四、解题思路
- 输入目标整数T;
- 定义存储符合要求的数组集合arrList;
- 定义sum,计算窗口之和;
- 如果窗口之和大于目标t,left指针右移;
- 如果窗口之和等于目标t,表示获取到合适窗口;
- left指针右移,继续探索新窗口;
- 如果right指针超出范围,break;
- right指针右移,继续探索新窗口;
- 如果窗口之和小于目标t,right指针右移;
- 按照自然数个数升序排序,自然数个数最少的表达式优先输出;
- 按照指定格式输出。
五、Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 目标整数T
int t = sc.nextInt();
int[] arr = new int[t];
for (int i = 0; i < t; i++) {
arr[i] = i + 1;
}
// 符合要求的数组集合
List<int[]> arrList = new ArrayList<>();
int left = 0;
int right = 1;
// 计算窗口之和
int sum = arr[left];
// 滑动窗口
while (left < t) {
// 如果窗口之和大于目标t,left指针右移
if (sum > t) {
sum -= arr[left++];
} else if (sum == t) {// 如果窗口之和等于目标t,表示获取到合适窗口
int[] oks = Arrays.copyOfRange(arr, left, right);
arrList.add(oks);
// left指针右移,继续探索新窗口
sum -= arr[left++];
// 如果right指针超出范围,break
if (right >= t) {
break;
}
// right指针右移,继续探索新窗口
sum += arr[right++];
} else {// 如果窗口之和小于目标t,right指针右移
sum += arr[right++];
}
}
// 按照自然数个数升序排序,自然数个数最少的表达式优先输出
arrList.sort((x, y) -> x.length - y.length);
// 按照指定格式输出
for (int[] array : arrList) {
StringJoiner stringJoiner = new StringJoiner("+");
for (int i : array) {
stringJoiner.add(String.valueOf(i));
}
System.out.println(t + "=" + stringJoiner);
}
System.out.println("Result:" + arrList.size());
}
六、效果展示
1、输入
100
2、输出
100=100
100=18+19+20+21+22
100=9+10+11+12+13+14+15+16
Result:3
🏆下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。