对每个给定的分子式,求出每个原子的个数,按照原子字母表的顺序排列,并输出

题目:给出一个字符串格式的化学分子式,计算原子的个数每个化学元素都是由一个大写字母,或者一个大写字母后跟着若干个小写字母组成,例如H是一个化学元素,Mg也是一个化学元素。每个分子式中,原子的个数写在元素后面,如果原子个数是1,那么原子个数省略。例如H20和H202都是有效的分子式,但H102不是有效分子式。每个分子式中包含若干括号,为简单起见,分子式中只有括号每次输入一个分子式,对每个给定的分子式,求出每个原子的个数,按照原子字母表的顺序排列,并输出。

package test;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

/**
 * 思路:对分子式进行遍历,先判断是元素是否符合要求,在判断元素是大小写或者是数字,如果是大写,对下一位进行判断是否是小写大写或数字,确认是否是原子,并
 * 产生响应的操作,如果是小写,则也需要判断下一位为是否大写或者数组或者小写,并产生响应的操作,如果是数组,也需要对下一位进行判断是大写或者数组,并产生响应操作,
 * 遍历完成后对讲所有的原子和个数值存储到map中,再对map中的key进行排序,最后打印出来
 */
public class JustClass {
  public static void main(String[] strs) {
    // 输入字符串
    Scanner sc = new Scanner(System.in);
    String s = sc.nextLine();

    // 定义map
    Map<String, Integer> hh = new HashMap<String, Integer>();

    // 检查分子式是否合格
    if (s.contains("1")) {
      System.out.println("非有效的分子格式");
      return;
    }

    // 0~9数字对应十进制48-57
    // a~z字母对应的十进制97-122 十六进制61-7A
    // A~Z字母对应的十进制65-90 十六进制41-5A

    // 定义两个变量存储原子元素和个数
    String lowchar = "";
    String num = "";

    // 遍历
    for (int i = 0; i < s.length(); i++) {
      // //判断是否是括号,如果有跳出本次循环
      // if((s.charAt(i)+"").equals("(") || (s.charAt(i)+"").equals(")")){
      // continue;
      // }

      // 判断第一位字符
      if (i == 0) {
        // 判断是否大写
        if (90 <= ((int) s.charAt(i)) || ((int) s.charAt(i)) <= 65) {
          System.out.println("非有效的分子格式");
          return;
        } else {

          // 判断字符下一位是否小写,是小写先存储到string中
          if (97 <= ((int) s.charAt(i + 1)) && ((int) s.charAt(i + 1)) <= 122) {
            lowchar = s.charAt(i) + "";
          } else if (50 <= ((int) s.charAt(i + 1)) && ((int) s.charAt(i + 1)) <= 57) { // 判断字符下一位是否数字
            lowchar = s.charAt(i) + "";
          } else if (65 <= ((int) s.charAt(i + 1)) && ((int) s.charAt(i + 1)) <= 90) { // 判断字符下一位是否大写
            hh.put(s.charAt(i) + "", 1);
          } else {
            System.out.println("非有效的分子格式");
            return;
          }
        }
      }

      // 判断最后一位之前的字符
      if (i != 0 && i < s.length() - 1) {
        // 如果i是大写字符
        if (65 <= ((int) s.charAt(i)) && ((int) s.charAt(i)) <= 90) {
          // 判断字符下一位是否小写,是小写先存储到string中
          if (97 <= ((int) s.charAt(i + 1)) && ((int) s.charAt(i + 1)) <= 122) {
            lowchar = s.charAt(i) + "";
          } else if (50 <= ((int) s.charAt(i + 1)) && ((int) s.charAt(i + 1)) <= 57) { // 判断字符下一位是否数字
            lowchar = s.charAt(i) + "";
          } else if (65 <= ((int) s.charAt(i + 1)) && ((int) s.charAt(i + 1)) <= 90) {
            // 如果map中已经包含了a则值加一
            if (hh.containsKey(s.charAt(i))) {
              int v = hh.get(s.charAt(i)) + 1;
              hh.remove(s.charAt(i));
              hh.put(s.charAt(i) + "", v);
            } else {
              hh.put(s.charAt(i) + "", 1);
            }
          } else {
            System.out.println("非有效的分子格式");
            return;
          }
        }
        // 如果i是数字
        if (50 <= ((int) s.charAt(i)) && ((int) s.charAt(i)) <= 57) {
          // i下一位是大写
          if (65 <= ((int) s.charAt(i + 1)) && ((int) s.charAt(i + 1)) <= 90) {
            num = num + s.charAt(i) + "";
            // 如果map中已经包含了a则值加一
            if (hh.containsKey(lowchar)) {
              hh.remove(lowchar);
              hh.put(lowchar, Integer.valueOf(num));
            } else {
              hh.put(lowchar, Integer.valueOf(num));
            }

            // 清空
            num = "";
            lowchar = "";
          } else if (50 <= ((int) s.charAt(i + 1)) && ((int) s.charAt(i + 1)) <= 57) {
            num = num + s.charAt(i) + "";
          } else {
            System.out.println("非有效的分子格式");
            return;
          }
        }

        // i是小写
        if (97 <= ((int) s.charAt(i)) && ((int) s.charAt(i)) <= 122) {
          // 下一位是大写
          if (65 <= ((int) s.charAt(i + 1)) && ((int) s.charAt(i + 1)) <= 90) {
            lowchar = lowchar + s.charAt(i) + "";
            // 如果map中已经包含了a则值加一
            if (hh.containsKey(lowchar)) {
              hh.remove(lowchar);
              hh.put(lowchar, 1);
            } else {
              hh.put(lowchar, 1);
            }

            // 清空
            num = "";
            lowchar = "";
          } else if (50 <= ((int) s.charAt(i + 1)) && ((int) s.charAt(i + 1)) <= 57) { // 是数字存储到str中
            lowchar = lowchar + s.charAt(i);
          } else if (97 <= ((int) s.charAt(i + 1)) && ((int) s.charAt(i + 1)) <= 122) {
            lowchar = lowchar + s.charAt(i);
          } else {
            System.out.println("非有效的分子格式");
            return;
          }
        }

      }
      // 对最后一位字符进行处理
      if (i == s.length() - 1) {
        // 如果i是大写字符
        if (65 <= ((int) s.charAt(i)) && ((int) s.charAt(i)) <= 90) {
          // 如果map中已经包含了a则值加一
          if (hh.containsKey(s.charAt(i))) {
            int v = hh.get(s.charAt(i)) + 1;
            hh.remove(s.charAt(i));
            hh.put(s.charAt(i) + "", v);
          } else {
            hh.put(s.charAt(i) + "", 1);
          }
        } else if (97 <= ((int) s.charAt(i)) && ((int) s.charAt(i)) <= 122) { // 如果小写
          lowchar = lowchar + s.charAt(i) + "";
          // 如果map中已经包含了a则值加一
          if (hh.containsKey(lowchar)) {
            hh.remove(lowchar);
            hh.put(lowchar, 1);
          } else {
            hh.put(lowchar, 1);
          }
        } else if (50 <= ((int) s.charAt(i)) && ((int) s.charAt(i)) <= 57) {
          num = num + s.charAt(i) + "";
          // 如果map中已经包含了a则值加一
          if (hh.containsKey(lowchar)) {
            hh.remove(lowchar);
            hh.put(lowchar, Integer.valueOf(num));
          } else {
            hh.put(lowchar, Integer.valueOf(num));
          }
        }
      }
    }

    // 排序
    String[] sr = BubbleSort(hh);
    // 打印map
    for (int i = 0; i < sr.length; i++) {
      System.out.println(sr[i] + "     " + hh.get(sr[i]));
    }
  }

  /**
   * @time 2019年11月6日上午9:28:22
   * @author lll
   * @describe BubbleSort
   */
  private static String[] BubbleSort(Map<String, Integer> hh) {
    String[] ss = new String[hh.size()];
    int m = 0;
    for (String re : hh.keySet()) {
      ss[m] = re;
      m++;
    }
    for (int i = 0; i < ss.length; i++) {
      for (int j = i; j < ss.length; j++) {
        if ((int) ss[i].charAt(0) > (int) ss[j].charAt(0)) {
          String key = ss[i];
          ss[i] = ss[j];
          ss[j] = key;
        }
      }
    }
    return ss;
  }
}

 

### 回答1: 好的,以下是用中文回复: 为了顺序输出给定字符串中出现过的大写英文字母,可以编写一个程序来实现。首先需要遍历字符串中的每个字符,然后检查它是否是大写英文字母。如果是大写英文字母且之前没有出现过,则将它输出,并将其添加到一个已经出现的字母列表中。最后,如果已经输出了所有的大写英文字母,则输出“not found”。 下面是一些伪代码,可以用来实现这个程序: ``` 输入字符串 已经输出过的字母列表 = 空列表 for 每个字符 in 字符串: if 字符是大写英文字母 and 字符没有在已经输出过的字母列表中: 输出字符 将字符添加到已经输出过的字母列表中 if 已经输出过的字母列表为空: 输出 "not found" ``` 希望这个伪代码能够帮助您实现一个能够顺序输出给定字符串中出现过的大写英文字母的程序。 ### 回答2: 为了实现本题,我们需要将给定的字符串进行遍历,并且判断其中的每一个字符是否为大写英文字母。如果是,则需要判断该字母是否已经输出过,如果没有输出,则将其输出并标记为已输出过。最后判断是否有大写英文字母输出过,如果没有则输出“not found”。 下面给出一个Python实现的示例代码: ```python str = input("请输入一段字符串:") upper_case = set() # 用一个集合来存储已经输出过的大写英文字母 for c in str: if c.isupper(): if c not in upper_case: print(c, end=" ") upper_case.add(c) if len(upper_case) == 0: print("not found") ``` 首先我们读入一段字符串,并且新建一个空的集合用来存储已经输出过的大写英文字母。以字符串中每一个字符为循环变量进行遍历,如果该字符是大写英文字母,那么检查是否已经输出过,如果没有则输出并添加到集合中。遍历完成后检查集合的长度,如果为0则输出“not found”。 需要注意的是,上面的代码中用到了Python中的集合数据类型,集合中的元素是唯一的,因此添加已经存在的元素不会有任何效果。以上代码中的upper_case.add(c)可以保证不会重复输出同一个大写英文字母。如果使用其他的编程语言,需要自行维护已输出过的大写英文字母的状态。 ### 回答3: 题目要求编写一个程序,来输出给定字符串中出现过的大写英文字母。我们可以采用遍历字符串的方法,逐个检查每一个字符是否为大写英文字母,如果是,则输出该字母。为了确保不重复输出相同的字母,我们可以使用列表来存储已输出过的字母。 首先,我们需要输入一个字符串,可以使用input()函数来实现。然后,我们定义一个空列表来存储已输出过的字母。接着,使用for循环遍历字符串中的每一个字符,判断该字符是否为大写英文字母。如果是,则检查该字母是否在已输出过的列表中,如果不在,则将该字母输出,并将其添加到已输出过的列表中。最后,判断已输出过的字母列表是否为空,如果是,则输出“not found”。 下面是代码的实现: ```python string = input('请输入字符串:') output = [] for s in string: if s.isupper(): if s not in output: output.append(s) print(s, end=' ') if not output: print('not found') ``` 在上面的代码中,我们使用了str的isupper()方法来判断字符是否为大写英文字母。isupper()返回True表示字符为大写字母,返回False表示不是大写字母。另外,我们使用了end参数来指定输出的结束符,在本例中我们将其设置为一个空格,这样每次输出一个字母后就会添加一个空格,使输出结果更美观。 综上所述,我们可以通过遍历字符串并使用一个列表来实现顺序输出给定字符串中所出现过的大写英文字母,每个字母只输出一遍。如果字符串中不存在大写英文字母,则输出“not found”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值