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万以内,这样的数有几个,分别是多 少

  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. 根据键盘录入的数值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);

在这里插入图片描述

  1. 键盘录入一个学生成绩(用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();
  1. 输出杨辉三角形,要求,根据键盘录入的行数,决定等腰三角形的行数。
// 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); // 输出这一行的字符
}

在这里插入图片描述

  1. 求完数。一个数如果恰好等于它的所有真因子(即除了自身外的所有因数)之和,这个数就称为"完 数"。请编程求出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. 有1、2、3、4一共四个数字,能组成多少个不相等且无重复数字的三位数?都是多少?

注:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的就 可以了。

  1. 键盘录入一个正整数,请求: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();

在这里插入图片描述

  1. 有一分数序列: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除外)


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部