編程題
- 給定一個字符串“adgeidjdddiggg”刪除出現次數最小的字符,輸出“dgiddddiggg”
思路:輸入爲字符串,輸出爲字符串情況 => 巧用對象obj={}
function text1(str) {
let len = str.length
let obj = {}
let chart
// 先轉成對應的對象,統計出現次數{ a: 1, d: 5, g: 4, e: 1, i: 2, j: 1 }
for (let i = 0; i < len; i++) {
chart = str.charAt(i) // charAt()字符串方法,返回指定位置上的字符
if (!obj.hasOwnProperty(chart)) {
obj[chart] = 1
} else {
obj[chart] = ++obj[chart]
}
}
// 找到出現次數最小值min
let min = obj[chart]
for (var key in obj) {
if (min > obj[key]) {
min = obj[key]
}
}
// 將原字符串轉成數組,若數組中的字符串爲最小值的key即刪除數組中的字符
let arr = str.split('')
for (var kit in obj) {
if (obj[kit] === min) {
for (let j = 0; j < arr.length; j++) {
if (arr[j] == kit) {
arr.splice(j, 1)
}
}
}
}
// 將數組轉爲字符串輸出
let newStr = arr.join('')
return newStr
}
var str = 'adgeidjdddiggg'
text1(str)
- 一一對應關係,輸入兩個字符串,判斷其是否爲一一對應關係
例如:abce->jkop;滿足一一對應關係
abce->jkoc;不滿足條件
忽略:理想條件下輸入的兩個字符串長度相等且均合法
輸入兩個字符串,輸出true/false
// 思路:反向思考,排除一對多的情況(aabced->acqjkl),排除多對一的情況(abcdefg->aajkqom)排除交叉對應(abcd->bcae)
function oneFaceOne(str1, str2) {
let obj1 = {}
let obj2 = {}
// 排除一對多的情況
for (var i = 0; i < str1.length; i++) {
let chart1 = str1.charAt(i)
let chart2 = str2.charAt(i)
if (obj1.hasOwnProperty(chart1) && obj1[chart1] != chart2) {
return false
} else {
obj1[chart1] = chart2
}
}
// 排除多對一的情況
for (var j = 0; j < str2.length; j++) {
let chart1 = str1.charAt(j)
let chart2 = str2.charAt(j)
if (obj2.hasOwnProperty(chart2) && obj2[chart2] != chart1) {
return false
} else {
obj2[chart2] = chart1
}
}
// 排除交叉對應
for (var key in obj1) {
for (var kit in obj2) {
if (key === kit && obj1[key] !== obj2[kit]) {
return false
}
}
}
return true
}
-
給定一個字符串“adgeidjdddiggg”輸出“d出現的次數最多,最多5次”(與第一題相似)
-
導航欄查詢,本質:嵌套數組的遍歷查找,類似於二叉樹的查找
二叉樹遍歷方式
前序遍歷:abdefgc
中序遍歷:debgfac
後序遍歷:edgfbca
輸入:obj 111
arr = [{
name: 'add',
id: 1,
child: [
{
name: 'age',
id: 11,
child: [
{
name: 'end',
id: 111
}
]
},
{
name: 'like',
id: 12,
child: [
{
name: 'secend',
id: 121
}
]
}
]
}
// ...可以有多個對象
]
輸出:["add","age","end",111]
function oneFaceOne(arr, num) {
let result = []
let toArr = function(arr, num) {
for (var i = 0; i < arr.length; i++) {
if (i > 0) {
result.pop()
}
if (arr[i].child) {
result.push(arr[i].name)
toArr(arr[i].child, num)
} else if (arr[i].id == num) {
result.push(arr[i].name)
result.push(arr[i].id)
return result
}
}
}
toArr(arr, num)
return result
}
- 數組降維(會做第四題的前提)
5.1 數組中無對象的情況,arr = [1,2,3[4,4,5],[3,4],[13,[4,66,6],7],“end”]
讓數組和字符串相加,數組會調用toString()方法,先轉化成字符串,隨即執行加運算符
加號+運算符詳情
// 可以直接使用數組處理方法split()
function arrayDrop(arr) {
let result = '' + arr //1,2,3,84,49,5,13,74,13,4,66,6,7,end
result = result.split(',')
console.log(result)
}
5.2 數組中存在對象的情況arr = [1, 2, 3, [84, 49, 5], [13, 74], [13, [4, 66, 6], 7], {name:“miaomiao”,age:2},“end”]
function arrayDrop(arr) {
let result = []
let toArr = function(arr) {
arr.forEach(item => {
item instanceof Array ? toArr(item) : result.push(item)
})
}
toArr(arr)
return result
}
框架題
-
發佈訂閱
-
React最新版本特性
-
redux
-
HOC高階函數
-
組件間的通信有哪幾種方式(是通信方法有那幾種ref)