每日java5-33

  1. //给出一个正整数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);

}

}

  1. //输出一个整数,表示所有碎片的平均长度,四舍五入保留两位小数。如样例所示: 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));

}

}

  1. //扑克牌顺子,四个大小王(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;

}

}

  1. 输入一个递增排序的数组和一个数字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);

}

}

欢迎提问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值