最近在學習《數據結構與算法JavaScript描述》這本書,對JavaScript的特性和數據結構都有了進一步的了解和體會。
學習之余,也進行了相應的練習,題目難度不大,但是對所學知識的鞏固十分有幫助,所以在這里和大家做一個分享。
注:題目主要來源於牛客網,這是一個不錯的網站,對於代碼的學習和自我能力的檢驗很有幫助,有興趣的朋友可以去看看。
這些題目解法絕大多數是根據自己的思路做的,並且幾乎都采用了多種方法,某些方法參考了網站中其他朋友的代碼,如果
有更好的解法也歡迎大家提出來,我會進行詳細的補充。如果有明顯的錯誤也求大家輕噴。
首先是數組的部分,關於JavaScript中數組的操作在上一篇的博客"Javascipt操作數組"中做過比較詳細的介紹,如果對下
面的題目解法中的方法有所疑問的朋友可以去看看。
Talk is cheap,show me the code!
【數組】
一、移除數組 arr 中的所有值與 item 相等的元素。不要直接修改數組 arr,結果返回新的數組。
// 方法一 使用過濾器方法
function remove(arr, item) {
return arr.filter(function(x){
return (x!=item);
})
}
// 方法二 創建新數組,將刪除指定元素后剩下的元素存入此數組並返回
function remove(arr,item){
var newArr = [];
//var index = 0;
for(var i in arr){
if(arr[i] != item){
newArr.push(arr[i]);
//newArr[index++] = arr[i];
}
}
return newArr;
}
// 方法三 淺復制原數組,並對新數組使用splice()方法刪除指定元素
function remove(arr, item) {
var newArr = arr;
for (var i = 0; i < newArr.length; i += 1) {
if (newArr[i] === item) {
newArr.splice(i, 1);
}
}
return newArr;
}
二、移除數組 arr 中的所有值與 item 相等的元素,請直接在給定的 arr 數組上進行操作
function removeWithoutCopy(arr,item){
for(var i=0;i<arr.length;i++){
if(arr[i]===item){
arr.splice(i,1);
i--; //因為每次刪除一個元素,數組長度減一,所以需要將 i 減一
}
}
return arr;
}
三、在數組 arr 末尾添加元素 item。不要直接修改數組 arr,結果返回新的數組
// 方法一 concat() 該方法不會改變現有的數組,而僅僅會返回被連接數組的一個副本。
function append(arr,item){
return arr.concat(item);
}
// 方法二 slice(0)復制數組
function append(arr, item) {
var newArr = arr.slice(0); //復制數組
newArr.push(item); //添加元素
return a;
}
// 方法三 給數組添加元素
function append(arr,item){
var newArr = new Array();
for(var i=0;i<arr.length;i++){
newArr[i] = arr[i];
}
newArr[newArr.length] = item;
return newArr;
}
四、刪除數組 arr 最后一個元素。不要直接修改數組 arr,結果返回新的數組
/ 方法一 直接將原數組的1到length-1的元素賦值給新數組並返回
function truncate(arr) {
var newArr = [];
for(var i=0;i<arr.length-1;i++)
{
newArr[i] = arr[i];
}
return newArr;
}
// 方法二 slice(start,end) 從數組中返回選定的元素
function truncate(arr){
return arr.slice(0,arr.length-1);
}
// 方法三 push()
function truncate(arr){
var newArr = [];
for(var i in arr){
if(i != arr.length-1){
newArr.push(arr[i]);
}
}
return newArr;
}
五、在數組 arr 開頭添加元素 item。不要直接修改數組 arr,結果返回新的數組
// 方法一 新建數組並為第一個元素賦值為item
function prepend(arr, item) {
var newArr = [];
newArr[0] = item;
for(var i=0;i<arr.length;i++){
newArr[i+1] = arr[i];
}
return newArr;
}
// 方法二 類似方法一,但是直接用concat連接newArr和arr
function prepend(arr,item){
var newArr = [];
newArr[0] = item; //newArr.push(item);
newArr.concat(arr);
return newArr;
}
// 方法三 unshift()方法
function preaend(arr,item){
var newArr = arr.slice(0);
return newArr.unshift(item);
}
六、刪除數組 arr 第一個元素。不要直接修改數組 arr,結果返回新的數組
//方法一:直接將原數組的第1~(length-1)的元素賦值給新的數組並返回
function delHead(arr){
var newArr = [];
for(var i=0;i<arr.length-1;i++){
newArr[i] = arr[i+1];
}
return newArr;
}
// 方法二 shift()方法
function delHead(arr){
var newArr = arr.slice(0);
newArr.shift();
return newArr;
}
// 方法三 直接截取arr的第二到最后的元素到新數組
function delHead(arr){
var newArr = arr.slice(1);
return newArr;
}
七、合並數組 arr1 和數組 arr2。不要直接修改數組 arr,結果返回新的數組
// 方法一:使用concat()方法
function concat(arr1,arr2){
var arr = arr1.concat(arr2);
return arr;
}
//方法二: 將arr2中的元素全部插入到arr1中
function concat(arr1,arr2){
var newArr = new Array();
for(var j=0;j<arr1.length;j++){
newArr[j] = arr1[j];
}
for(var i=0;i<arr2.length;i++){
arr[j+i] = arr2.[i];
}
return arr;
}
// 方法三:分別將arr1和arr2的內容加到新數組中
function concat(arr1,arr2){
var newArr = [];
for(var i in arr1){
newArr.push(arr1[i]);
}
fmr(var j in arr2){
newArr.push(arr2[j])
}
return newArr;
}
八、在數組 arr 的 index 處添加元素 item。不要直接修改數組 arr,結果返回新的數組
// 方法一:使用splice(index,n,item)方法
function insert(arr, item, index) {
var newArr = arr.slice(0);
newArr.splice(index,0,item);
return newArr;
}
// 方法二:將原數組在index處拆分並添加item賦值給新數組
function insert(arr,item,index){
var newArr = new Array();
newArr = arr.slice(0,index).concat(item).concat(arr.slice(index,arr.length));
// newArr = arr.slice(0,index).push(item).concat(arr.slice(index,arr.length));
return newArr;
}
// 方法三:類似方法二,對新數組進行多次賦值
function insert(arr,item,index){
var newArr = [];
for(var i=0;i<index;i++){
newArr[i] = arr[i];
}
newArr[index] = item;
for(var j=index;j<arr.length;j++){
newArr[j+1] = arr[j];
}
}
九、統計數組 arr 中值等於 item 的元素出現的次數
// 方法一:對數組中的元素進行逐個判斷,若值等於item,則計數加1
function count(arr,item){
var num = 0;
for(var i=0;i<arr.length;i++){
if(arr[i]===item){
num++;
}
}
return num;
}
// 方法二:類似方法一,使用forEach()
function count(arr,item){
var num = 0;
arr.forEach(function(elem){
if(elem===item){
num++;
}
})
return num;
}
// 方法三:使用splice()方法進行元素的逐個判斷(稍繁瑣)
function count(arr,item){
var num = 0;
while(arr.indexOf(item)!==-1){ //即找到值等於item的元素
arr.splice(arr.indexOf(item),1);//找到則刪除該元素,繼續判斷剩余元素
num++;
}
}
十、找出數組 arr 中重復出現過的元素
// 方法一:若最早和最晚出現某元素的index進行比較,若不相等則重復,若新數組中未存儲此元素則存儲
function duplicates(arr) {
var result = [];
arr.forEach(function(elem){
if(arr.indexOf(elem) !=arr.lastIndexOf(elem) && result.indexOf(elem) == -1){
result.push(elem);
}
});
return result;
}
// 方法二:首先判斷數組中值等於x的index是否唯一,若唯一若新數組中未出現則存入新數組
function duplicates(arr){
var newArr = [];
for(var i=0;i<arr.length;i++){
if(arr.indexOf(arr[i])!==i){ //數組中值為某值的元素不唯一
if(newArr.indexOf(arr[i])===-1){//若新數組中未存儲此元素
newArr.push(arr[i]);
}
}
}
return newArr;
}
十一、為數組 arr 中的每個元素求二次方。不要直接修改數組 arr,結果返回新的數組
// 方法一:對數組中的元素逐個平方
function square(arr){
var newArr = arr.slice(0);
for(var i=0;i<newArr.length;i++){
newArr[i] = newArr[i] * newArr[i];
}
return newArr;
}
// 方法二:類似方法一,代碼更為簡潔
function square(arr) {
var newArr = arr.slice(0);
for(var i in newArr){
newArr[i]*=newArr[i];
}
return newArr;
}
十二、在數組 arr 中,查找值與 item 相等的元素出現的位置
// 方法一:找到和item值相等的元素並返回index
function findAllOccurrences(arr, target) {
var index = [];
for(var i in arr){
if(arr[i]===target){
index.push(i);
}
}
return index;
}
// 方法二:滿足indexOf(target)!=-1的元素輸出index
function findAllOcurrences(arr, target){
var index = [];
var i = arr.indexOf(targte); //i為第一個滿足要求的元素位置
while(i!==-1){
index.push(i);
i = arr.indexOf(target,i+1);
}
return index;
}
