/**
@param {number[][]} matrix
@return {void} Do not return anything, modify matrix in-place instead.
n维数组旋转 90 度算法
*/
export const rotate = function (matrix: number[][]) {
let n = matrix.length
// matrix[x][y] => matrix[y][n - 1 - x]
const changeItem = (num: number, x: number, y: number, rodateTime: number, isOnce?: boolean) => {
// 终止条件
rodateTime++
if (num === matrix[x][y] && !isOnce && rodateTime > 4) return
let space = matrix[y][n - 1 - x]
matrix[y][n - 1 - x] = num
changeItem(space, y, n - 1 - x, rodateTime)
}
for (let j = 0; j < Math.floor(n / 2); j++) {
let rodateTime = 0;
for (let i = j; i < n - 1 - j; i++) {
changeItem(matrix[j][i], j, i, rodateTime, true)
rodateTime = 0
}
}
return matrix
};
// ((())) 暴力解法找到所有的夸号组合
export const findkhByQuery = (num: number = 3) => {
/**
* arr.push()
* 怎样组合呢? (())()
* ( + )()()
* 思路:一个夸号去移动
*
* ()()() 取出第1个 从 0 移动到 最后一位
* let str = ‘(’
* )()() 发现 不管第一个如何移动 只有第一次才行 移动到右边后发现有首位是 右夸号结束移动
*
* (()() 取出第2个 ‘)’ 从 0 移动到 最后一位
* let str = ‘)’
*
* (()() 取出第3个 ‘)’ 从 0 移动到 最后一位
* let str = ‘(’
*
*
* value
*/
let initStr = ‘’;
let arr = []
for (let i = 0; i < num; i++) {
initStr += “()”
}
let n = initStr.length
let map: any = {}
const isValid = (str: string): boolean => {
if (!str || str[0] === ')') {
return false
}
let stack = []
for (let i = 0; i < str.length; i++) {
if (str[i] === '(') {
stack.push('(')
}
if (str[i] === ')') {
let x = stack.pop()
if (!x) {
return false
}
}
}
if (stack.length == 0) {
return true
}
return false
}
// 可以再套一个循环 用于决定要 去几个字符串
for (let k = 0; k < num * 2; k++) {
for (let i = 0; i < num * 2; i++) {
// 从 0 移动到最后一位
// let val = initStr[i]
// 取出需要拿出来的字符串
let val = initStr.slice(0, k + 1)
console.log(val, 'val');
// 取到切割剩下的
// 'abcdef' abc cde
let newStr = initStr.slice(k + 1, n)
for (let j = 0; j < num * 2; j++) {
let moveRes = newStr.slice(0, j) + `${val}` + newStr.slice(j, n)
// debugger
// debugger
if (!map[moveRes]
&& isValid(moveRes)
) {
map[moveRes] = moveRes
arr.push(moveRes)
}
// arr.push(moveRes)
}
}
}
console.log(arr, 'arr');
}
// console.log(findkhByQuery(3));
/**
*/
var partition = function (s: string) {
let arr: string[][] = []
arr.push(s.split(‘’))
for (let i = 0; i < s.length; i++) {
let subitem: string[] = []
for (let j = i + 1; j < s.length; j++) {
let val = s.substring(i, j + 1)
if (val.split('').reverse().join('') === val) {
/*
如何做到自动补全的功能? abcde bcd => a,bcd,e
* abacd_aba => ,aba,c,d,_,aba,
* abacd_abaDDC => ,aba,c,d,_,aba,D,D,C
* 切掉空的
*/
let ns = s.replace(val, `,${val},`)
// 去掉首尾的,号
if (ns.startsWith(',')) {
ns = ns.substring(1, ns.length)
} else if (ns.endsWith(',')) {
ns = ns.substring(0, ns.length - 1)
}
let resItem: any[] = []
// aba,cd_,aba => aba,c,d,_,aba
ns.split(',').forEach(item => {
if (item !== val) {
resItem = [...resItem, ...item.split('')]
} else {
resItem.push(item)
}
})
subitem = resItem
}
}
if (subitem.length) {
arr.push(subitem)
}
}
return arr
};
console.log(partition(“fff”));
// 模板字符串替换 const func = (template: string, obj: any) => { } console.log(func(template, obj), ‘xxx’); /* */ } console.log(qpl([-1, 2, 3]));
const template =
let obj = { name: ‘glack’, age: ‘23’ }
Object.keys(obj).forEach(item => {
let key = ‘{{ ’ + item + ’ }}’
template = template.replace(key, ’ ’ + obj[item] + ’ ')
})return template
实现全排列
[1]
[12, 21]
[312, 132, 123, 321, 231, 213][0,-1,1]
[1]
f( [1, 2, 3] ) = f([1, 2]) 和 3 的排列
f( [1, 2]) = f([1]) 和 2 的排列
f( [1] ) = [1]
思路:f(12345) = f(1234) 和 5 组合起来的数组
const qpl = (nums: number[]): any[] => {
let time = 0const dfs = (a: number[]): any[] => {
let n = a.length
if (n == 1) {
return [a]
}
let res: any[] = []
let fontArr = a.slice(0, n - 1) // [1, -1]
let lastStr = a.slice(n - 1, n)[0] // 0
dfs(fontArr)?.forEach(it1 => {
// [1, -1] [-1, 1] 中 使用 0 来移动位置
for (let i = 0; i < it1.length + 1; i++) {
res.push([...it1.slice(0, i), lastStr, ...it1.slice(i, it1.length)])
}
})
return res
}
return dfs(nums)