@TOC
前言
刷dy刷了十个视频五个视频讲字符串、排序和相关的面试题,不禁心头一震写下此文,又温习了一遍排序,和算法
想当初比赛的时候,被一个反转指定字符串折磨的半死不活,再也不想回到过去了
字符串反转(🏁)
场景:用户输入一串字符,根据用户输入的指令反转相应的字符
**思路:
1.编写一个静态方法,可以接受用户传入的字符串,以及反转的区间
2.针对输入的内容要进行判断(if)
3.针对用户输入的字符串,将其转成char[]数组(为什么是char? 因为字符串的最小元素是字符)
4.利用一个for循环遍历数组,传进去两个变量一首一尾,for循环的过程抽象成从两端到中间的形式,在此过程中达到交换两个不同位置元素的目的
5.异常处理保证程序健壮性(没达到if的条件就抛出运行异常),在主函数接收异常并处理**
public class String01 {
public static void main(String[] args) {
System.out.println("=====反转前=====");
String str = "abcdefg";
System.out.println(str);
System.out.println("=====反转后=====");
try {
str = method(str, 2, 6);
} catch (Exception e) {
System.out.println(e.getMessage());
return;
}
System.out.println(str);
}
public static String method(String str, int n1, int n2) {
//做一个验证
//重要技巧——先写出正确的情况然后取反!!!!!!!!!!!!!!!!!!!!!!!!!!!
if (!(str != null&& n1>=0&&n1>n2&&n2<str.length())) {
throw new RuntimeException("参数不正确");
}
char[] chars = str.toCharArray();
char temp = ' ';
for (int i = n1, j = n2; i < j; i++, j--) {
temp = chars[i];
chars[i] = chars[j];
chars[j] = temp;
}
return new String(chars);
}
}
定制排序(🚩)
场景:从大到小,从小到大排序自由切换
**思路:
1.写一个冒泡排序的静态方法,可以向形参传入要比较的数组,Comparator对象
2.利用匿名内部类实现Comparator接口达到自定义的功能
3.把Comparator对象返回的结果作为执行排序的条件
4.异常处理**
public class ArraysTest {
public static void main(String[] args) {
int[] arr = {1, -9, 8, 55, 4};
bubble01(arr, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
int i1= (Integer) o1;
int i2= (Integer) o2;
return i1- i2; // return i2- i1;
}
});
System.out.println(Arrays.toString(arr));
}
public static void bubble01(int[] arr, Comparator c) { //排好以后本质还是数组
int temp = 0;
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
//数组排序的值由c.compare(arr[j],arr[j+1])返回的值决定
if (c.compare(arr[j],arr[j+1])>0) { //从小到大
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
}
注册问题(🏁)
场景:输入用户名、密码、邮箱,如果信息录入正确,则提示注册成功,否则生成异常对象要求:
**1.用户名长度为2或3或4
2.密码的长度为6,要求全是数字
3.邮箱中包含@和.并且@在.的前面**
**思路:
1.大前提是输入不为空
2.用户名长度通过比较字符串长度实现
3.通过两个boolean类型的方法实现密码和邮箱的判别功能(返回true\false结合if比较直接)
4.邮箱格式可以通过比较字符串中指定字符下标来实现
5.异常处理**
public static void main(String[] args) {
String name = "pyq";
String ps = "123456";
String em = "123@qq.com";
try { //try-catch 维护程序 接收异常
check(name, ps, em);
System.out.println("恭喜你注册成功!");
} catch (Exception e) { //接收check方法中可能抛出的异常并输出异常终止程序
System.out.println(e.getMessage());
}
}
public static void check(String userName, String passWord, String email) {
if (!(userName != null && passWord != null && email != null)) {
throw new RuntimeException("不能输入空白哦~~~");
}
int ul = userName.length();
int pl = passWord.length();
if (!(ul >= 2 && ul <= 4)) { //用户名长度为2或3或4
throw new RuntimeException("你输入的用户名不正确~"); //不合条件——抛出异常
}
if (!(isDigtal(passWord) && pl == 6)) {//密码的长度为6,要求全是数字isDigital
throw new RuntimeException("您输入的密码有误~");
}
if (!(eCheck(email))) { //邮箱中包含@和.并且@在.的前面
throw new RuntimeException("您输入的邮箱格式不正确~");
}
}
public static boolean isDigtal(String password) { //此方法用于判断输入的密码是否全为数字
char[] m1 = password.toCharArray();//通过把输入的字符串密码转成字符数组,遍历比较来确定
for (int i = 0; i < m1.length; i++) {
if (m1[i] < '0' || m1[i] > '9') {
return false;
}
}
return true;
}
public static boolean eCheck(String email) { //此方法用于判断邮件里的@与.问题
int i = email.indexOf("@"); //通过获取字符串下标并比较的方式实现功能
int j = email.indexOf(".");
if (!(i < j && i >= 0)) {
return false;
}
return true;
}
}
数据类型统计
场景:用户输入,判断字符串里面有多少个大写字母,多少个小写字母,多少个数字
**1.字符串转成char[]字符数组
2.遍历数组与'0','9','a','z','A','Z'比较
3.异常处理**
public class homework03 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入字符串~");
String eg=scanner.next();
printName(eg);
}
public static void printName(String str) {
if (str == null) {
System.out.println("不要输入为空!");
return;
}
int sL = str.length();
int numCount = 0; //用于计数的变量
int lowerCount = 0;
int upperCount = 0;
char[] m1 = str.toCharArray();
//老套路 把输入的字符串转成字符数组通过遍历的方式 进行逻辑判断实现功能
for (int i = 0; i < sL; i++) {
if (str.charAt(i) >= '0' && str.charAt(i) <= '9') {
numCount++;
} else if (str.charAt(i) >= 'a' && str.charAt(i) <= 'z') {
lowerCount++;
} else if (str.charAt(i) >= 'A' && str.charAt(i) <= 'z') {
upperCount++;
}
}
System.out.println("数字有:" + numCount + "\n小写字母有:" +
lowerCount + "\n大写字母有:" + upperCount);
}
}
Ps:这个匿名内部类真是好难用啊
厨艺怎么样,大杂烩好吃吗?