比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。
请你实现这个将字符串进行指定行数变换的函数:string convert(string s, int numRows);
示例 1:
输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"
示例 2:
输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:
L D R
E O E I I
E C I H N
T S G
-
- // 将一个给定字符串根据给定的行数,
- // 以从上往下,从左到右进行 Z 字形排列。
- // 示例1:
- // 输入:s = "LEETCODEISHIRING", numRows = 3
- // 输出:"LCIRETOESIIGEDHN"
- function convert(str, numRows) {
- // 判断特殊情况
- if (numRows == 1 || numRows >= str.length) return str;
- // 无法确定指定存储的数据类型和个数
- var str2 = [];
- // 遍历确定个数和数据类型 --字符串
- for (let i = 0; i < numRows; i++) {
- str2[i] = ""
- }
- // 标志位,判断往上还是往下
- var flag = 1;
- // 指定行数
- var rowNum = 0;
- // 具体操作: 通过数组存储不同行数的字符,
- // 由于是Z, 先向下,然后到指定行数,又往上走
- for (var j = 0; j < str.length; j++) {
- str2[rowNum] += str[j];
- // 判断方向
- if (rowNum == numRows - 1) {
- flag = -1;
- }
- if (rowNum == 0) flag = 1;
- rowNum += flag;
- }
- // 定义变量返回字符串
- var str1 = "";
- for (let k = 0; k < str2.length; k++) {
- str1 += str2[k];
- }
- return str1;
- }
- // 打印输出
- str = "LEETCODEISHIRING";
- console.log("信息", convert(str, 4));
-
输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一
示例1:
输入
5,4,[1,2,4,4,5]
输出
3
方法:二分查找
-
- // 请实现有重复数字的有序数组得二分查找
- // 输出在数组中第一个大于等于查找值的位置
- // 如果数组中不存在这样的数据,则输出数组长度加一
- function upper_bound_(n, v, list) {
- let low = 0;
- let high = n - 1;
- while (low <= high) {
- const mid = parseInt((low + high) / 2);
- //中间值小于目标值,则目标值在右边, 从中间值后一个值往右查找。
- if (list[mid] < v) {
- low = mid + 1;
- }
- //中间值大于目标值,则目标值在左边,从l往右查找到从中间值往前一个值。
- else if (list[mid] > v) {
- high = mid - 1;
- }
- //中间值等于目标值。继续往左寻找是否还有相等的值
- else {
- if (list[mid - 1] != v) {
- return mid;
- }
- high = mid - 1;
- }
- }
- return n + 1;
- }
- let index = upper_bound_(5, 7, [1, 2, 3, 4, 5]);
- console.log("查找位置:", index);
-