1. 将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “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
<script>
// 将一个给定字符串根据给定的行数,
// 以从上往下,从左到右进行 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));
</script>
2. 请实现有重复数字的有序数组的二分查找。
输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一
示例1:
输入
5,4,[1,2,4,4,5]
输出
3
方法:二分查找
<script>
// 请实现有重复数字的有序数组得二分查找
// 输出在数组中第一个大于等于查找值的位置
// 如果数组中不存在这样的数据,则输出数组长度加一
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);
</script>