CSDN每日一题学习训练——Java版(逆序输出、Z 字形变换、输出每天是应该学习还是休息还是锻炼)
最佳答案 问答题库658位专家为你答疑解惑
版本说明
当前版本号[20231108]。
目录
文章目录
- 版本说明
- 目录
- 逆序输出
- 题目
- 解题思路
- 代码思路
- 参考代码
- Z 字形变换
- 题目
- 解题思路
- 代码思路
- 参考代码
- 输出每天是应该学习还是休息还是锻炼
- 题目
- 代码思路
- 参考代码
逆序输出
题目
如:abcd1234,逆序输出:4321dcba
解题思路
- 首先,我们需要将输入的字符串 “abcd1234” 转换为字符数组。
- 然后,我们使用一个for循环从字符数组的末尾开始遍历,直到第一个元素。
- 在每次循环中,我们将当前字符打印到控制台。这样,我们就可以得到逆序输出的结果。
代码思路
-
首先,定义一个字符串变量
input
,其值为"abcd1234"。// 定义一个字符串变量input,值为"abcd1234"String input = "abcd1234";
-
然后,使用
toCharArray()
方法将字符串转换为字符数组try1
。// 将字符串转换为字符数组try1char[] try1 = input.toCharArray();
-
接着,使用for循环从后向前遍历字符数组
try1
,并使用System.out.print()
方法打印每个字符。
// 使用for循环从后往前遍历字符数组try1for (int i = try1.length - 1; i >= 0; i--) {// 输出当前字符System.out.print(try1[i]);}
参考代码
将输入的字符串反转并打印出来。
import java.lang.*;
import java.io.*;
import java.util.*;
class ReverseString {public static void main(String[] args) {String input = "abcd1234";char[] try1 = input.toCharArray();for (int i = try1.length - 1; i >= 0; i--)System.out.print(try1[i]);}
}
Z 字形变换
题目
将一个给定字符串 s 根据给定的行数 numRows
,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入:s = “PAYPALISHIRING”, numRows = 3
输出:“PAHNAPLSIIGYIR”
示例 2:
输入:s = “PAYPALISHIRING”, numRows = 4
输出:“PINALSIGYAHRPI”
解释:
P I N
A L S I G
Y A H R
P I
示例 3:
输入:s = “A”, numRows = 1
输出:“A”
提示:
1 <= s.length <= 1000
s 由英文字母(小写和大写)、‘,’ 和 ‘.’ 组成
1 <= numRows <= 1000
解题思路
从上往下、从左到右进行 Z 字形排列如下:
以"PAYPALISHIRING"为例子:
- 首先,我们需要理解该函数接收一个整数数组作为输入,并返回一个新的数组,其中每个元素是原数组中对应元素的平方。
- 接下来,我们可以使用循环遍历输入数组中的每个元素,并将其平方后添加到新的数组中。
- 在实现过程中,我们需要注意以下几点:
- 输入数组可能包含负数或零,因此我们需要对负数或零进行特殊处理,确保它们的平方仍然是一个非负数。
- 输入数组的长度可能是任意的,因此我们需要动态地分配内存来存储新的数组。
代码思路
-
如果numRows等于1
(代表最后只需要输出一行数据,就可以把原来的数据直接输出)
,直接返回原字符串s,因为不需要进行任何转换。// 如果numRows等于1,直接返回原字符串sif (numRows == 1)return s;
-
计算字符串s的长度len。
// 获取字符串s的长度int len = s.length();
-
如果len小于等于numRows,说明不足以形成Z字形排列,直接返回原字符串s。
// 如果字符串s的长度小于等于numRows,直接返回原字符串sif (len <= numRows)return s;
-
计算每个周期的长度cycle_len,即Z字形排列中相邻两行之间的字符数量。
// 计算每个周期的长度int cycle_len = 2 * numRows - 2;
-
计算完整周期的数量full_cycles和剩余字符的数量left。
// 计算完整周期的数量int full_cycles = len / cycle_len;// 计算剩余字符的数量int left = len % cycle_len;
-
使用StringBuilder对象r来存储转换后的字符串。
// 创建一个StringBuilder对象r,用于存储转换后的字符串StringBuilder r = new StringBuilder();
-
遍历完整周期,将每个周期的第一个字符添加到r中。
// 遍历完整周期for (int i = 0; i < full_cycles; ++i) {// 将每个周期的第一个字符添加到r中r.append(s.charAt(i * cycle_len));}
-
如果存在剩余字符,将第一个字符添加到r中。
// 如果存在剩余字符if (left > 0) {// 将第一个字符添加到r中r.append(s.charAt(full_cycles * cycle_len));}
-
遍历numRows-2行,对于每一行i,遍历完整周期,将第i+1个字符添加到r中,然后将第i+1+cycle_len-2*(i+1)个字符添加到r中。如果存在剩余字符,将对应的字符添加到r中。
// 遍历numRows-2行for (int i = 0; i < numRows - 2; ++i) {// 遍历完整周期for (int j = 0; j < full_cycles; ++j) {// 将第i+1个字符添加到r中r.append(s.charAt(j * cycle_len + i + 1));// 将第i+1+cycle_len-2*(i+1)个字符添加到r中r.append(s.charAt(j * cycle_len + i + 1 + cycle_len - 2 * (i + 1)));}// 如果存在剩余字符if (left > 0) {// 如果j * cycle_len + i + 1小于len,将该字符添加到r中if (j * cycle_len + i + 1 < len)r.append(s.charAt(j * cycle_len + i + 1));// 如果j * cycle_len + i + 1 + cycle_len - 2 * (i + 1)小于len,将该字符添加到r中if (j * cycle_len + i + 1 + cycle_len - 2 * (i + 1) < len)r.append(s.charAt(j * cycle_len + i + 1 + cycle_len - 2 * (i + 1)));}}
-
遍历完整周期,将每个周期的最后一个字符添加到r中。
// 遍历完整周期for (int i = 0; i < full_cycles; ++i)// 将每个周期的最后一个字符添加到r中r.append(s.charAt(i * cycle_len + numRows - 1));
-
如果存在剩余字符且长度大于等于numRows,将最后一个字符添加到r中。
// 如果存在剩余字符且长度大于等于numRows,将最后一个字符添加到r中if (left >= numRows)r.append(s.charAt(full_cycles * cycle_len + numRows - 1));
-
返回转换后的字符串r的字符串形式。
// 返回转换后的字符串return r.toString();
参考代码
它包含一个名为convert的方法,该方法接受一个字符串s和一个整数numRows作为参数,并返回一个字符串。这个方法的主要功能是将给定的字符串 s 按照 Z字形排列,其中numRows表示Z字形的行数。
class Solution {public String convert(String s, int numRows) {if (numRows == 1)return s;int len = s.length();if (len <= numRows)return s;int cycle_len = 2 * numRows - 2;int full_cycles = len / cycle_len;int left = len % cycle_len;StringBuilder r = new StringBuilder();int i;for (i = 0; i < full_cycles; ++i) {r.append(s.charAt(i * cycle_len));}if (left > 0) {r.append(s.charAt(i * cycle_len));}for (i = 0; i < numRows - 2; ++i) {int j;for (j = 0; j < full_cycles; ++j) {r.append(s.charAt(j * cycle_len + i + 1));r.append(s.charAt(j * cycle_len + i + 1 + cycle_len - 2 * (i + 1)));}if (left > 0) {if (j * cycle_len + i + 1 < len)r.append(s.charAt(j * cycle_len + i + 1));if (j * cycle_len + i + 1 + cycle_len - 2 * (i + 1) < len)r.append(s.charAt(j * cycle_len + i + 1 + cycle_len - 2 * (i + 1)));}}for (i = 0; i < full_cycles; ++i)r.append(s.charAt(i * cycle_len + numRows - 1));if (left >= numRows)r.append(s.charAt(i * cycle_len + numRows - 1));return r.toString();}
}
输出每天是应该学习还是休息还是锻炼
题目
30天中,从第一天开始五天学习,一天休息、一天锻炼,输出每天是应该学习还是休息还是锻炼
代码思路
-
在
main
方法中,定义了三个整数变量n1
、n2
和n3
,以及一个循环变量i
。 -
循环从
i=1
开始,直到i<=30
为止。在每次循环中,首先检查n1
是否小于5。如果是,则输出字符串"学习",并将n1
的值加1,然后使用continue
语句跳过当前循环的剩余部分,进入下一次循环。for (i = 1; i <= 30; i++) {if (n1 < 5) { // 如果n1小于5,执行学习操作System.out.println("学习");n1++; // n1加1continue; // 跳过本次循环剩余部分,进入下一次循环}
-
如果
n1
不小于5,则输出字符串"休息",接着输出字符串"锻炼"。然后将n1
的值重置为0,并使i
的值加1。这样,在下一次循环中,将再次执行条件判断,并根据条件输出相应的字符串。else { // 如果n1不小于5,执行休息和锻炼操作System.out.println("休息");System.out.println("锻炼");n1 = 0; // n1重置为0i++; // i加1,跳过本次循环剩余部分,进入下一次循环}
-
整个程序的目的是按照指定的规则输出交替的字符串序列,即每5次循环输出一次"学习",然后输出"休息"和"锻炼"。
参考代码
用于打印"学习"和"休息"或"锻炼"的字符串。
public class HelloWorld {public static void main(String []args) {int n1=0,n2=0,n3=0,i;for(i=1;i<=30;i++){if(n1<5){System.out.println("学习");n1++;continue;}else{System.out.println("休息");System.out.println("锻炼");n1=0;i++;}}}
}
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"CSDN每日一题学习训练——Java版(逆序输出、Z 字形变换、输出每天是应该学习还是休息还是锻炼)":http://eshow365.cn/6-36871-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: Python逆序的三位数(任意位数
- 下一篇: 【Python3】【力扣题】242. 有效的字母异位词