一、进制转换
写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。
背景知识: 16进制以0x开头,后面跟数字0 ~ 9或字母A ~ F(小写也可以)
解法一 : API 法
public static void main(String[] args) {Scanner in = new Scanner(System.in);String a = in.nextLine();// 去掉表示十六进制的 0x 前缀 —— 从而使得我们可以使用下面的 API 实现进制转换a = a.substring(2);// 实现进制转换的两种 API// int ans = Integer.valueOf(a, 16);int ans = Integer.parseInt(a, 16);System.out.println(ans);}
解法二: 自己实现 API 法
思路很简单,就类似于给你一个 10 进制的字符串,如何整合成 10 进制数字 。 都是从后向前遍历,取出每一位,然后整合在一起。
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);String a = in.next();a = a.substring(2);int n = a.length();int ans = 0;int base = 1;for(int i=n-1; i>=0; i--){// 当前位的值int num;// 取出当前位, 并且转为大写int curChar = Character.toUpperCase(a.charAt(i));if(curChar >= '0' && curChar <= '9'){num = curChar - '0';} else {num = 10 + curChar - 'A';}ans += num * base;base *= 16;}System.out.println(ans);}
}
二、 字符串最后一个单词的长度
计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)
public static void main(String[] args) {Scanner in = new Scanner(System.in);String a = in.nextLine();int ans = 0;int idx = a.length() - 1;while(idx != -1 && a.charAt(idx) != ' '){idx--;ans++;}System.out.println(ans);}
注: 为什么不用 split 法, 因为占用太多额外的空间了,所以不用 API 了 (虽然我是最懒懒喜欢用 API 的人,但是这种占用太多额外空间的,而且明显有更优解法的,咱就不用了)
三、坐标移动
开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。
字符串类型题,主要考查点在于字符串处理函数,加上循序渐进的思考能力
import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public boolean isEffective(String str) {if(str.isEmpty() || str.length() > 3){return false;}String direction = "ADWS";if(direction.indexOf(str.charAt(0)) == -1) {return false;}for(int i=1; i<str.length(); i++){if(!Character.isDigit(str.charAt(i))) {return false;}}return true;}public static void main(String[] args) {Main main = new Main();Scanner in = new Scanner(System.in);String a = in.nextLine();String[] strs = a.split(";");int x = 0;int y = 0;for(String str : strs) {// 先判断是否无效if(!main.isEffective(str)){continue;}// 有效进行处理char direction = str.charAt(0);int step = Integer.parseInt(str.substring(1));if(direction == 'A'){x -= step;} else if(direction == 'D'){x += step;} else if(direction == 'W'){y += step;} else {y -= step;}}System.out.println(x + "," + y);}
}
四、密码验证合格程序
吐血 …
总结反思 : 没必要写这么长,没必要那么多标注位,拆成函数解决,就 ok 了
import java.util.Scanner;
import java.util.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);while (in.hasNextLine()) { String pas = in.nextLine();if(pas.length() <= 8){System.out.println("NG");continue;} boolean over = false;// 每位标志分别表示 大写字母,小写字母 , 数字, 其他符号int[] flag = new int[4];for(int i=0; i<pas.length(); i++){char cur = pas.charAt(i);if(cur == ' ' || cur == '\n' ){over = true;break;}if(Character.isDigit(cur)){flag[0] = 1;} else if(Character.isLowerCase(cur)){flag[1] = 1;} else if(Character.isUpperCase(cur)){flag[2] = 1;} else {flag[3] = 1;}// 说明已经凑齐了if(Arrays.stream(flag).sum() >= 3){break;}}// 包含空格和换行符,不满足题意if(over){System.out.println("NG");continue;}// 没凑齐,是不满足题意的if(Arrays.stream(flag).sum() < 3){System.out.println("NG");continue;}Set<String> set = new HashSet();for(int i=0; i<pas.length()-1; i++){for(int j=i+2; j<pas.length(); j++){String subStr = pas.substring(i, j+1);if(set.contains(subStr)){over = true;break;}set.add(subStr);}}if(over){System.out.println("NG");} else {System.out.println("OK");}}}
}