- //给出一个正整数n,请给出所有的包含n个’(‘和n个’)‘的字符串,使得’(‘和’)'可以完全匹配。
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class text {
public static void main(String[] args) {
Scanner
sc = new Scanner(System.in);
int num = sc.nextInt();
List<String>
list = new ArrayList<>();
dfs(num, num, new String(), list);
for (int i = 0; i < list.size() - 1; i++) {
System.out.print(list.get(i) + ",");
System.out.println();
}
System.out.print(list.get(list.size() - 1));
}
public static void dfs(int l, int r, String str,
List res) {
if (l < 0 || r < 0 || l > r)
return;
if (l == 0 && r == 0) {
res.add(str);
return;
}
dfs(l - 1, r, str + '(', res);
dfs(l, r - 1, str + ')', res);
}
}
- //输出一个整数,表示所有碎片的平均长度,四舍五入保留两位小数。如样例所示: s = "aaabbaaac"所有碎片的平均长度 = (3 + 2 + 3 + 1) / 4 = 2.25
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class text {
public static void main(String[] args) {
Scanner
sc = new Scanner(System.in);
char[] chars = sc.nextLine().toCharArray();
List<Integer>
list = new ArrayList<>();
int l = 0, r = 0;
while (r < chars.length) {
if (chars[l] == chars[r])
r++;
else {
list.add(r - l);
l = r;
}
}
list.add(r - l);
double sum = 0;
for (int i : list)
sum += i;
double res = sum / list.size();
System.out.print(String.format("%.2f", res));
}
}
- //扑克牌顺子,四个大小王(0)可以代替任何数。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class text {
public static void main(String[] args) {
Scanner
sc = new Scanner(System.in);
System.out.println("输入扑克牌");
int[] a = new int[5];
for (int i = 0; i < a.length; i++) {
a[i] = sc.nextInt();
}
boolean re = isContinuous(a);
System.out.println(re);
}
public static boolean isContinuous(int[] numbers) {
if (numbers == null || numbers.length <= 0)
return false;
int zeroNum = 0;// 大小王数目
ArrayList<Integer>
list = new ArrayList<>();// 记录非0的数
for (int i = 0; i < numbers.length; i++) {
if (numbers[i] == 0)
zeroNum++;
else
list.add(numbers[i]);
}
Collections.sort(list);
// 如果有重复数字,则不是顺子
for (int i = 1; i < list.size(); i++)
if (list.get(i) == list.get(i - 1))
return false;
int min = list.get(0);// list中最小值
int max = list.get(list.size() - 1);// list中最大值
int preNum = max - min + 1;// 应该有这么多数
int lackNum = preNum - list.size();// 缺少的数
// 如果缺少的数<=大小王的数,说明大小王可以变成任意数去替代缺少的数
if (lackNum <= zeroNum)
return true;
return false;
}
}
- 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
思路:双指针。一前一后,中间靠拢数列满足递增,设两个头尾两个指针i和j,
若ai
- aj == sum,就是答案(相差越远乘积越小)
若ai
- aj > sum,aj肯定不是答案之一(i 前面的数已是不可能),j–
若ai
- aj < sum,ai肯定不是答案之一(j 后面的数已是不可能),i++
import java.util.ArrayList;
import java.util.Scanner;
public class text {
public static void main(String[] args) {
Scanner
sc = new Scanner(System.in);
System.out.println("输入数的长度:");
int n = sc.nextInt();
int[] a = new int[n];
System.out.println("输入数组的长度:");
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
System.out.println("输入要查找的数字和:");
int sum = sc.nextInt();
ArrayList<Integer>
res = new ArrayList<>();
int l = 0, r = a.length - 1;
while (l < r) {
if (a[l] + a[r] == sum) {
res.add(a[l]);
res.add(a[r]);
break;
}
else if (a[l] + a[r] < sum)
l++;
else
r--;
}
System.out.println(res);
}
}
157.输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
import java.util.ArrayList;
import java.util.Scanner;
public class text {
public static void main(String[] args) {
Scanner
sc = new Scanner(System.in);
System.out.println("输入总和:");
int sum = sc.nextInt();
int l = 1, r = 2;
ArrayList<Integer>
list = new ArrayList<>();
while (l < r) {
// 由于是连续的,差为1的一个序列,那么等差求和公式是(a0+an)*n/2
int tempSum = (l + r) * (r - l + 1) / 2;
if (tempSum == sum) {
// 相等,那么就将窗口范围的所有数添加进结果集
for (int i = l; i <= r; i++)
list.add(i);
l++;
}
else if (tempSum < sum)
// 如果当前窗口内的值之和小于sum,那么右边窗口右移一下
r++;
else
// 如果当前窗口内的值之和大于sum,那么左边窗口右移一下
l++;
}
System.out.println(list);
}
}
欢迎提问。