0711(006天 字符串基本操作)
0711(006天 字符串基本操作)
每日一狗(边牧十一)

主标题
文章目录
- 0711(006天 字符串基本操作)
- 主标题
- 1. 字符串基础操作
- 1.1 基本操作
- 1.2 字符串转数字
- 1.3 数字转字符串
- 1.4 字符串新方法
- 练习题
- 扩展小芝士
课前测试题
// 输入两个正整数,输出两个整数的最小公倍数
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个正整数:");
int num1 = sc.nextInt();
System.out.println("请输入第二个正整数:");
int num2 = sc.nextInt();
int max_ = num1 > num2 ? num1 : num2;
for (; max_ <= num1 * num2; max_++) {if (max_ % num1 == 0 && max_ % num2 == 0) {System.out.println(num1 + "和" + num2 + "的最小公倍数为" + max_);break;}
}

1. 字符串基础操作
- 复合类型
- 字符序列(序列不允许做任何调整)
- 长度存在限制
复合类型的属性

1.1 基本操作
s1.length():字符串长度s1.charAt(2):获取指定索引位置上的字符
String s1 = "123获取字符合数"; // 创建字符串对象
s1.length(); // 获取字符串长度
s1.charAt(2); // 获取指定索引位置上的字符
// 遍历操作字符串
for (int i = 0; i < s1.length(); i++) { System.out.println(s1.charAt(i) + "==" + (int) s1.charAt(i));
}
s1+s2:将字符串s2拼接到s1后边
String s1 = "ab";
String s2 = S1 + "c"; // "abc"
eg: 生成随机字符串验证码
长度为6
可使用字符限定
"0123456789abcdefghijkmnpqrstuvwxyz"
// 生成随机字符串验证码
int len = 6;
final String source = "0123456789abcdefghijkmnpqrstuvwxyz";
String cc = ""; // 验证码存储字符串
for (int i = 0; i < len; i++) {double d1 = Math.random(); // 随机数生成int tmp = (int) (d1 * source.length()); // 修正随机数范围cc += source.charAt(tmp); // 索引并拼接验证码字符串
}
System.out.println(cc);

s1.indexOf(s2): 在s1中查找s2第一次出现的位置,不存在时返回-1
eg: 找出指定字符串 出现的指定字符串
// 找出指定字符串 出现的指定字符串
int pos = -1;
String ss = "TODO Auto-generated method ene stub";
while ((pos = ss.indexOf("ene", pos + 1)) != -1) {System.out.println(pos);
}
System.out.println("=================");
pos = ss.length();
while ((pos = ss.lastIndexOf("ene", pos - 1)) != -1) {System.out.println(pos);
}
System.out.println("=================");
// 找出指定字符串 出现的指定字符串
for (pos = ss.indexOf("ene"); pos != -1; pos = ss.indexOf("ene", pos + 1)) {System.out.println(pos);
}

s1.substring(start,stop):切割字符串- stop可以不写,默认为最后
String ss = "TODO Auto-generated method ene stub";
System.out.println(ss.substring(1, 2));

eg:实现 split
一开始 pos 设定为
-s1.length可以将后边一开始的begin拉平到0循环内部修正
begin拆分字符串后边第一个的索引。每次循环begin等于pos加一个s1的长度
// TODO Auto-generated method stub
String ss = "TODO Aeneuto-generated metenehod stub";
String s1 = "ene";
int begin = 0;
int pos = 0 - s1.length();
while (true) {begin = pos + s1.length();pos = ss.indexOf(s1, begin);if (pos < 0) {break;}System.out.println(ss.substring(begin, pos));
}
System.out.println(ss.substring(begin));

-
s1.split(s2)- 按照指定字符串将字符串拆分为若干内容
- 返回一个数组
-
s1.equals(s2):比较s1和s2的内容是否相等,返回值为布尔值 -
考试常见方法
- intern()
1.2 字符串转数字
Scanner(读取键盘录入数据)
- next():读取键盘录入数据,遇到分隔符(默认空格),停止录入,返回一个String类的对象
- nextline():方法是读取一整行,以一个
回车符作为结束标记停止扫描。
- 目标类型名.parse类型(String)
- Integer.parsetInt(String) // 字符串转整形
- Double.parsetDouble(String) // 字符串转整形
eg:
1.3 数字转字符串
“” + 任意类型数据
1.4 字符串新方法

练习题
1、打印5位数中的所有回文数,每行打印10个数。最后统计一下一共有多少个5位回文数。 注:回文数即正反读都是一个数,5位数的话,只要个位与万位相同,十位与千位相同就是一个回 文数。
2、根据键盘录入的数值1、2、3、4,…7输出对应的星期一、星期二、星期三…星期日 延申题目
3、键盘录入一个学生成绩(用int表示),自动输出该同学的成绩评级。学生的分数取值范围[0,100] 分数大于等于90的,评级"优秀"; 分数大于等于80,小于90的,评级"良好"; 分数大于等于70,小于80的,评级"中等"; 分数大于等于60,小于70的,评级"及格"; 分数小于60的,评级"不及格";
4、输出杨辉三角形,要求,根据键盘录入的行数,决定等腰三角形的行数。
5、求完数。一个数如果恰好等于它的所有真因子(即除了自身外的所有因数)之和,这个数就称为"完 数"。请编程求出1000 以内的所有完数。
6、有1、2、3、4一共四个数字,能组成多少个不相等且无重复数字的三位数?都是多少? 注:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的就 可以了。
7、键盘录入一个正整数,请求:1.它是几位数?2.逆序打印出各位数字。
8、有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13。求出这个数列的前20项之和。 注:提前告诉答案是32.66026079864164
9、一个整数,它加上100或者268后都是一个完全平方数,请问在1万以内,这样的数有几个,分别是多 少
- 打印5位数中的所有回文数,每行打印10个数,最后统计一下一共有多少个5位回文数。
- 看他不是回文数简单,先肯定在否定
- 转成字符串,用索引来定位各个位数的字符
- 歪路子:翻转字符串跟原来的进行比较判断
// 循环判定
int num = 1234421;
String ss = num + "";
boolean huiWen = true;
for (int i = 0; i < ss.length() / 2; i++) {char c1 = ss.charAt(i);char c2 = ss.charAt(ss.length() - 1 - i);if (c1 != c2) {huiWen = false;break;}
}
System.out.println(num + ((huiWen) ? "" : "不") + "是回文数");// 翻转判断
int num1 = 123421;
String ss2 = num + "";
String ss3 = "";
for (int i = ss2.length() - 1; i >= 0; i--) {ss3 += ss2.charAt(i);
}
System.out.println(num1 + ((ss2.equals(ss3) ? "是回文数" : "不是回文数")));// ***********终稿 统计一下一共有多少个5位回文数。 ***********
int nums = 0;
for (int num = 10000; num < 100000; num++) {String ss = num + "";boolean huiWen = true;for (int i = 0; i < ss.length() / 2; i++) {char c1 = ss.charAt(i);char c2 = ss.charAt(ss.length() - 1 - i);if (c1 != c2) {huiWen = false;break;}}if (huiWen) {System.out.print(num + "\t");nums++;if (nums % 10 == 0) {System.out.println();}}
}
System.out.println("10000 到 100000一共有" + nums + "个回文数");

- 根据键盘录入的数值1、2、…7输出对应的星期一、星期二…星期天
- switch一个一个判断
- 使用字符串索引机制在
"一二三四五六天"之间进行取值
// 根据键盘录入的数值1、2、...7输出对应的星期一、星期二...星期天
Scanner sc = new Scanner(System.in);
System.out.println("请输入数字(1~7)");
int week = 0;
while (week > 7 || week <= 0) {String sw = sc.next();week = Integer.parseInt(sw);
}
// ************* switch *************
String ss = "星期";
switch (week) {case 1:ss += "一";break;case 2:ss += "二";break;case 3:ss += "三";break;case 4:ss += "四";break;case 5:ss += "五";break;case 6:ss += "六";break;case 7:ss += "天";break;
}
System.out.println("今天是" + ss);
// ************* 字符串索引法 *************
String weeks = "一二三四五六天";
String ss1 = "星期" + weeks.charAt(week - 1);
System.out.println("今天是" + ss1);

衍生题目:银行数字读法生成
未考虑其他情况
// 银行数字读法生成
int num = 1234;
String numStr = "" + num;
String hanStr = "壹贰叁肆伍陆柒捌玖";
String weiStr = "仟佰拾元";
String res = "";
for (int i = numStr.length() - 1; i >= 0; i--) {int x = Integer.parseInt(numStr.charAt(i) + ""); // 找到该位置的数字的整形int index = Integer.parseInt(x - 1 + ""); // 找到这个位置的数字的映射索引res = hanStr.charAt(index) + "" + weiStr.charAt(i) + res;
}
System.out.println(res);

- 键盘录入一个学生成绩(用int表示),自动输出该同学的成绩评级。
学生的分数取值范围[0,100] 分数大于等于90的,评级"优秀";
分数大于等于80,小于90的,评级"良好";
分数大于等于70,小于80的,评级"中等";
分数大于等于60,小于70的,评级"及格";
分数小于60的,评级"不及格";
// TODO Auto-generated method stub
System.out.println("请输入学生成绩:(整形)");
Scanner sc = new Scanner(System.in);
int score = 0;
String scoreStr = "";
while (true) {String numStr = sc.next();int tmpNum = -1;try {tmpNum = Integer.parseInt(numStr);} catch (Exception e) {// TODO: handle exceptionSystem.out.println("输入数据不合法");}if (tmpNum <= 0 && tmpNum > 100) {System.out.println("输入数据超出范围,请重新输入");} else {score = tmpNum;break;}
}
if (score < 60) {scoreStr = "不及格";
} else if (score < 70) {scoreStr = "及格";
} else if (score < 80) {scoreStr = "中等";
} else if (score < 90) {scoreStr = "良好";
} else {scoreStr = "优秀";
}
System.out.println(scoreStr);
sc.close();
- 输出杨辉三角形,要求,根据键盘录入的行数,决定等腰三角形的行数。
// TODO Auto-generated method stub
int high = 0;
Scanner sc = new Scanner(System.in);
System.out.println("杨辉三角的高(正整数)");
// 规范输入
while (true) {String tmp = sc.next();try {high = Integer.parseInt(tmp);} catch (Exception e) {// TODO: handle exceptionSystem.out.println("您输入的合适不正确");}if (high <= 0) {System.out.println("您输入的合适不正确");} else {break;}
}
// 一遍一行
for (int i = 1; i <= high; i++) {String outStr = ""; // 存储要输出的字符串for (int n = 0; n < high - i; n++) { // 拼接空格outStr += " ";}for (int n = 0; n < i * 2 - 1; n++) { // 拼接※outStr += "※";}System.out.println(i + outStr); // 输出这一行的字符
}

- 求完数。一个数如果恰好等于它的所有真因子(即除了自身外的所有因数)之和,这个数就称为"完 数"。请编程求出1000 以内的所有完数。
// 它所有的真因子(即除了自身以外的约数)的和(即因子函数),
// 恰好等于它本身。如果一个数恰好等于它的因子之和,则称该数为“完全数”。
// 第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加,1+2+3=6。
for (int i = 1; i <= 1000; i++) {int sum = 0;for (int n = 1; n < i; n++) {sum += ((i % n == 0) ? n : 0);}if (sum == i) {System.out.print(i + "、");}
}

- 有1、2、3、4一共四个数字,能组成多少个不相等且无重复数字的三位数?都是多少?
注:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的就 可以了。
- 键盘录入一个正整数,请求:1.它是几位数?2.逆序打印出各位数字。
// 键盘录入一个正整数,请求:1.它是几位数?2.逆序打印出各位数字。
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个正整数");
int num = 0;
while (true) {try {num = sc.nextInt();} catch (Exception e) {// TODO: handle exceptionSystem.out.println("您输入的格式有误请重新输入");}if (num < 1) {System.out.println("您输入的格式有误请重新输入");} else {break;}
}
String numStr = num + "";
System.out.println(numStr.length() + "位");
for (int i = numStr.length() - 1; i >= 0; i--) {System.out.print(numStr.charAt(i) + "、");
}
sc.close();

- 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13。求出这个数列的前20项之和。
注:提前告诉答案是32.66026079864164 9、一个整数,它加上100或者268后都是一个完全平方数,请问在1万以内,这样的数有几个,分别是多 少?
// 2/1,3/2,5/3,8/5,13/8,21/13。求出这个数列的前20项之和。
double res = 0.0;
double num1 = 1.0;
double num2 = 1.0;
for (int i = 0; i < 20; i++) {double tmp = num1;num1 = num1 + num2; // 要先算分子num2 = tmp;res += (num1 / num2);
}
System.out.println(res);

扩展小芝士
-
字符串和注释以外不能写全角符号
-
C的核心指针
-
变量类型不可重复定义
-
字节整和短整形算术运算时会自动转成整形
-
数组类型的布尔类型为字节整,通常情况下为整形
-
简单类型没有属性或方法可以调用
-
随机整数生成
生成一个取值范围在
[0,5]之间的数生成一个
[0,1)范围内的随机数 乘一个 6 就可以生成int max = 10; // 取值范围最大值 for (int i = 0; i < 5; i++) {double tmpDouble = Math.random();int num = (int) (tmp * max + 1); //System.out.println(num); } -
范围一般都是含左不含右:[start,stop)
-
判断字符串的相等使用
equals不要用== -
Scanner(读取键盘录入数据)
- next():读取键盘录入数据,遇到分隔符(默认空格),停止录入,返回一个String类的对象
- nextline():方法是读取一整行,以一个
回车符作为结束标记停止扫描。
-
switch取值范围
- 可以是char类型
- 可以是整形(long除外)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!


