How does this Sudoku backtracking recursive algorithm trigger backtracking? - javascript
let row = this.findEmpty(puzzleString)[0];
let col = this.findEmpty(puzzleString)[1];
let i = this.findEmpty(puzzleString)[2];
if(!this.findEmpty(puzzleString)) return puzzleString
for(let num = 1; num < 10; num++){
if(this.checkValue(puzzleString, row, col, num)){
puzzleString[i] = num;
this.solve(puzzleString)
}
}
findEmpty(puzzleString) iterates over the puzzle string and returns the row (A-I), column (1-9), and index of a blank grid.
checkValue() contains 3 helper functions returning a boolean ensuring there are no conflicts across row, column, or region.
The loop iterates from 1-9 and the first value from 1-9 that passes checkValue() is assigned to the current blank grid and then triggers recursion by calling the parent function solve().
What I don't understand is the next statement and how that triggers backtracking.
if(this.findEmpty(puzzleString)){
puzzleString[i] = '.';
}
If the current blank grid being checked has no solution then I think the grid remains a blank ('.'). If this is correct, why is this statement necessary? What about this statement is triggering backtracking?
My initial inclination is that this statement is a psuedo-else statement that runs only if the loop fails to find a solution. It has to be placed outside the loop in order to allow the full iteration of 1 through 9. But then how does the code know to run solve() afterwards if solve() is only called if checkValue() suceeds?
Here's the full code:
solve(puzzleString) {
let row = this.findEmpty(puzzleString)[0];
let col = this.findEmpty(puzzleString)[1];
let i = this.findEmpty(puzzleString)[2];
if(!this.findEmpty(puzzleString)) return puzzleString
for(let num = 1; num < 10; num++){
if(this.checkValue(puzzleString, row, col, num)){
puzzleString[i] = num;
this.solve(puzzleString)
}
}
if(this.findEmpty(puzzleString)){
puzzleString[i] = '.';
}
if(puzzleString.includes('.')) return { error: 'Puzzle cannot be solved' }
return {
solution: puzzleString.join('')
}
}
findEmpty(puzzleString){
for(let i = 0; i < puzzleString.length; i++){
if(puzzleString[i] == '.'){
let row = String.fromCharCode('A'.charCodeAt(0) + Math.floor(i / 9));
let col = (i % 9) + 1;
return [row, col, i];
}
}
return false;
}
checkValue(puzzleString, row, column, value){
if(this.checkRowPlacement(puzzleString, row, column, value)&&
this.checkColPlacement(puzzleString, row, column, value)&&
this.checkRegionPlacement(puzzleString, row, column, value)){
return true;
}
return false;
}
checkRowPlacement(puzzleString, row, column, value) {
let coordinates = [];
let rowLetter;
let colNum;
let temp = [];
if(row){row = row.toUpperCase();}
for(let i = 0; i < puzzleString.length; i++){
rowLetter = String.fromCharCode('A'.charCodeAt(0) + Math.floor(i / 9));
colNum = (i % 9) + 1;
coordinates.push(rowLetter + colNum);
}
for(let i = 0; i < coordinates.length; i++){
if(coordinates[i][0] == row){
temp.push(puzzleString[i]);
}
}
temp = temp.join('');
return !temp.includes(value) ? true : false
}
checkColPlacement(puzzleString, row, column, value) {
let coordinates = [];
let rowLetter;
let colNum;
let temp = [];
if(row){row = row.toUpperCase();}
for(let i = 0; i < puzzleString.length; i++){
rowLetter = String.fromCharCode('A'.charCodeAt(0) + Math.floor(i / 9));
colNum = (i % 9) + 1;
coordinates.push(rowLetter + colNum);
}
for(let i = 0; i < coordinates.length; i++){
if(coordinates[i][1] == column){
temp.push(puzzleString[i]);
}
}
temp = temp.join('');
return !temp.includes(value) ? true : false
}
checkRegionPlacement(puzzleString, row, column, value) {
let coordinates = [];
let rowLetter;
let colNum;
let regions = [];
if(row) row = row.toUpperCase();
for(let i = 0; i < puzzleString.length; i++){
rowLetter = String.fromCharCode('A'.charCodeAt(0) + Math.floor(i / 9));
colNum = (i % 9) + 1;
coordinates.push(rowLetter + colNum);
}
for(let i = 0; i < coordinates.length; i+=27){
for(let k = 0; k < 9; k+=3){
regions.push(
coordinates.slice(i+k,i+k+3) + ',' +
coordinates.slice(i+k+9, i+k+12) + ',' +
coordinates.slice(i+k+18, i+k+21)
)
}
}
let region = regions.filter(x => x.includes(row + column))[0].split(',').map(x => puzzleString[coordinates.indexOf(x)]).join('');
return region.includes(value) ? false : true;
}
The backtracking happens when findEmtpy returns false. But as your code is not optimal, still many other options are tried while backtracking: none of the for loops that are pending in the recursion tree are interrupted, yet it is wasted effort to have them continue and calling checkValue as each of those calls will now return false. So, eventually all those for loops will end, and the recursion will backtrack, only to finish yet another loop and backtrack again, ...etc.
Here is an update of your main function to avoid some of that overhead that leads to no gain:
solve(puzzleString) {
// Only call findEmpty once!
let emptyCell = this.findEmpty(puzzleString);
if (!emptyCell) return { solution: puzzleString.join('') }; // return the success object
let [row, col, i] = emptyCell; // use destructuring assignment
for (let num = 1; num < 10; num++) {
if (this.checkValue(puzzleString, row, col, num)) {
puzzleString[i] = num;
let result = this.solve(puzzleString); // capture the return value
if (result.solution) return result; // success: fast backtracking!
}
}
puzzleString[i] = "."; // could not solve this spot
// backtrack to possibly take a different route in previous decisions
return { error: 'Puzzle cannot be solved' };
}
Related
generate 2 different random numbers from an Array?
my only issue so far is when the ships have the same value, I get an error message if I'm using VSC. TypeError: Assignment to constant variable. I was trying to get to different values by using the condition but I think it doesn't work. let grid = [[]]; const letters = "abc".toUpperCase(); // create the Grid const createGrid = (size) => { let row; let col = 0; for (row = 0; row < size; row++) { grid[row] = []; for (col = 0; col < size; col++) { grid[row][col] = `${letters[row]}${col + 1}`; } } }; createGrid(letters.length); console.table(grid); // Start the game //create ships const flatArray = grid.reduce((acc, curr) => { return [...acc, ...curr]; }, []); function getRandomNumber(len) { return Math.floor(Math.random() * len); } const randomNumber1 = getRandomNumber(flatArray.length); const randomNumber2 = getRandomNumber(flatArray.length); while(randomNumber1 == randomNumber2) { getRandomNumber(); } var shipOne = flatArray[randomNumber1]; var shipTwo = flatArray[randomNumber2]; console.log(shipOne); console.log(shipTwo);
Fix an infinite loop I created a snippet from your example code and it runs forever in the error case you are describing. A problem is that you have a while loop that will run forever: while(randomNumber1 == randomNumber2) { getRandomNumber(); } You run this code as long as randomNumber1 and randomNumber2 are the same but you update neither of them in the loop so it can never be false. Try this: while(randomNumber1 == randomNumber2) { randomNumber2 = getRandomNumber(flatArray.length); } You might also make your code a little smarter and remove elements from the flatArray array you have already chosen.
One other approach you could try is to create a function pickRandomEntries() that will pick N random entries from an array, without ever picking the same ones. To do this, we shuffle a copy of your flatArray(), then pick the first two items. This way we never have to check for the ships having the same value: let grid = [[]]; const letters = "abc".toUpperCase(); const createGrid = (size) => { let row; let col = 0; for (row = 0; row < size; row++) { grid[row] = []; for (col = 0; col < size; col++) { grid[row][col] = `${letters[row]}${col + 1}`; } } }; createGrid(letters.length); const flatArray = grid.reduce((acc, curr) => { return [...acc, ...curr]; }, []); // Shuffle an array into a random order (using Fisher-Yates) function shuffle(arr) { for(let i = arr.length - 1; i > 0; i--) { let index = Math.floor(Math.random() * (i + 1)); [arr[index], arr[i]] = [arr[i], arr[index]]; } return arr; } // Pick count random items from the array function pickRandomEntries(arr, count) { let shuffled = shuffle([...arr]); return shuffled.slice(0, count); } let [shipOne, shipTwo] = pickRandomEntries(flatArray, 2); console.log( { shipOne, shipTwo });
Inside of your while loop if the two random numbers were the same you would be stuck inside an infinite loop. Like Peter stated. To fix this use the code Peter stated but don't forget you still need to pass in the array length into this function. Otherwise you will have an error: while(randomNumber1 == randomNumber2) { randomNumber2 = getRandomNumber(flatArray.length); } Thanks!!
Character with longest consecutive repetition
i think i have wirtten the correct code for the problem only one thing and it that i return the first longest sequence how can i alter that to return the last maximum sequence? an example from codewars editor : for input '00000000000000111111111111111112222222222222223333333333333344444444444445555555555555666666666666777777777777888888888888888999999999999999999aaaaaaaaabbbbbbbbbbbbbbbbcccccccccccccccccccdddddddddddddddddddeeeeeeeeeeeeeeefffffffffffffggggggggggggggghhhhhhhhhhhhhiiiiiiiiiijjjjjjjjjjjjjjkkkkkkkkkkkkllllllllllmmmmmmmmmmnnnnnnnnnnnnnnoooooooooooopppppppppppppppppqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrrssssssssssttttttttttttuuuuuuvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyzzzzzzzzzzzzzz' Expected: ['c', 19], instead got: ['0', 19] here is my code: function longestRepetition(s) { var count = 0; var temp = s.charAt(0); var arr = []; for (var i = 0; i < s.length; i++) { if (temp === s.charAt(i)) { count++ temp = s.charAt(i) } else { temp = s.charAt(i); arr.push(count) count = 1; } if(i==s.length-1) arr.push(count); } if(arr.length>0) { var Max=arr[0] for(var i=0;i<arr.length;i++) { if(Max<=arr[i]) Max=arr[i]; } } else var Max=0; var mindex=arr.indexOf(Max); return [s.charAt(mindex),Max] }
I think this would be easier with a regular expression. Match any character, then backreference that character as many times as you can. Then, you'll have an array of all the sequential sequences, eg ['000', 'aaaaa']. Map each string to its length and pass into Math.max, and you'll know how long the longest sequence is. Lastly, filter the sequences by those which have that much length, and return the last item in the filtered array: function longestRepetition(s) { const repeatedChars = s.match(/(.)\1*/g); const longestLength = Math.max(...repeatedChars.map(str => str.length)); const longestChars = repeatedChars.filter(str => str.length === longestLength); return [longestChars.pop(), longestLength]; } console.log(longestRepetition('00000000000000111111111111111112222222222222223333333333333344444444444445555555555555666666666666777777777777888888888888888999999999999999999aaaaaaaaabbbbbbbbbbbbbbbbcccccccccccccccccccdddddddddddddddddddeeeeeeeeeeeeeeefffffffffffffggggggggggggggghhhhhhhhhhhhhiiiiiiiiiijjjjjjjjjjjjjjkkkkkkkkkkkkllllllllllmmmmmmmmmmnnnnnnnnnnnnnnoooooooooooopppppppppppppppppqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrrssssssssssttttttttttttuuuuuuvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyzzzzzzzzzzzzzz'));
The issue in your code is that minindex is an index in your arr, but that index has nothing to do with s. So s.charAt(minindex) makes no sense. You should maintain for which character you had found the count. For instance you could push in arr both the count and the corresponding character (as a subarray with two values). Then the rest of your code would only need little modification to make it work. Applying this idea to your code without changing anything else, we get this: function longestRepetition(s) { var count = 0; var temp = s.charAt(0); var arr = []; for (var i = 0; i < s.length; i++) { if (temp === s.charAt(i)) { count++ temp = s.charAt(i) // Not necessary: was already equal } else { arr.push([temp, count]); // <--- pair, BEFORE changing temp temp = s.charAt(i); count = 1; } if(i==s.length-1) arr.push([temp, count]); // <--- } if(arr.length>0) { var Max=arr[0]; // <-- Max is now a pair of char & count for(var i=0;i<arr.length;i++) { if(Max[1]<arr[i][1]) // Comparison changed to just less-than Max=arr[i]; } } else Max=[null, 0]; // Must be a pair here also return Max; // Just return the pair } console.log(longestRepetition('00000000000000111111111111111112222222222222223333333333333344444444444445555555555555666666666666777777777777888888888888888999999999999999999aaaaaaaaabbbbbbbbbbbbbbbbcccccccccccccccccccdddddddddddddddddddeeeeeeeeeeeeeeefffffffffffffggggggggggggggghhhhhhhhhhhhhiiiiiiiiiijjjjjjjjjjjjjjkkkkkkkkkkkkllllllllllmmmmmmmmmmnnnnnnnnnnnnnnoooooooooooopppppppppppppppppqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrrssssssssssttttttttttttuuuuuuvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyzzzzzzzzzzzzzz')); But you can do the same with less code: function longestRepetition(s) { let result = [null, 0]; // pair of character and count for (var i = 0; i < s.length; null) { let start = i++; while (i < s.length && s[i] === s[start]) i++; // Find end of series if (i - start > result[1]) result = [s[start], i - start]; } return result; } console.log(longestRepetition('00000000000000111111111111111112222222222222223333333333333344444444444445555555555555666666666666777777777777888888888888888999999999999999999aaaaaaaaabbbbbbbbbbbbbbbbcccccccccccccccccccdddddddddddddddddddeeeeeeeeeeeeeeefffffffffffffggggggggggggggghhhhhhhhhhhhhiiiiiiiiiijjjjjjjjjjjjjjkkkkkkkkkkkkllllllllllmmmmmmmmmmnnnnnnnnnnnnnnoooooooooooopppppppppppppppppqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrrssssssssssttttttttttttuuuuuuvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyzzzzzzzzzzzzzz'));
The solution below answers the question with O(n) runtime: function longestRepetition(s) { let count = s.length > 0 ? 1 : 0 let char = s.length > 0 ? s[0] : '' for (let string_i = 0; string_i < s.length - 1; string_i += 1) { // keep track of current_char let current_char = s[string_i] let next_char = s[string_i + 1] // while the next char is same as current_char let tracker = 1 while (current_char === next_char) { // add one to tracker tracker += 1 string_i += 1 next_char = s[string_i + 1] } // if tracker greater than count if (tracker > count) { // returned char = current char // count =tracker count = tracker; char = current_char; } } return [char, count] } console.log(longestRepetition("bbbaaabaaaa"))//, ["a",4]
Last element of the array is always NaN even though I used Number() function
Kindly help me investigate my function below since I'm stuck and still having a hard time figuring it out. All is well until it reaches the last column on the nested FOR loop. The last column of each row's values are only "0". However, I used the Number() function to make the cell values(i.e. "0") a number but I keep on getting NaN for the last element of the SUM & COUNT arrays. colCount = 326 while rowCount = 374. sum.length and count.length should really be ONLY 325 since the headers are unnecessary and the first column is just composed of time stamps. I was able to .push(0) successfully until the nested FOR loop changed the result of the last element to NaN. function processDataToDictionary(csv) { var allTextLines = csv.split(/\r\n|\n/); var csvArray = []; for (let i = 0; i < allTextLines.length - 1; i++) { var row = allTextLines[i].split(','); csvArray.push(row); } var colCount = csvArray[0].length; var rowCount = csvArray.length; //Arrays of values var count = []; var sum = []; var average = []; var headers = []; for (let i = 1; i < colCount; i++) { var current = csvArray[0][i].replace(/"/g, ''); sum.push(0); count.push(0); headers[i] = current; } for (let i = 1; i < rowCount; i++) { for (let j = 1; j < colCount; j++) { // Remove the quotes from your array current = csvArray[i][j].replace(/"/g, ''); // Added the Method IsNullOrWhiteSpace if (!isNullOrWhitespace(current)) { // Parse as double not int to account for dec. values sum[j] += Number(current); count[j]++; } } } for (let i = 0; i < colCount; i++) { average.push((sum[i] + 0.0) / count[i]); } for (let i = 1; i < colCount; i++) { // create an empty array dictionary[headers[i]] = average[i]; } return dictionary; } function isNullOrWhitespace(input) { if (input == " ") { return true; } else { return false; } }
This gives you a dictionary (Object) with the columns names as keys and numbers that appear to be the correct averages as values. But one must still check whether there is a fault in the logic somewhere and the averages are not correct in fact. function processDataToDictionary(csv) { function isNullOrWhitespace(input) { if (input === " ") { return true; } else if (input === null) { return true; //} else if (input === undefined) { //return true; } else { return false; } } var allTextLines = csv.split(/\r\n|\n/); var csvArray = []; for (let i = 0; i < allTextLines.length - 1; i++) { var row = allTextLines[i].split(','); csvArray.push(row); } var colCount = csvArray[0].length; var rowCount = csvArray.length; //Arrays of values var count = []; var sum = []; var average = []; var headers = []; for (let i = 1; i < colCount; i++) { var current = csvArray[0][i].replace(/"/g, ''); sum.push(0); count.push(0); headers[i] = current; } /**** I added these two lines ****/ sum.push(0); count.push(0); for (let i = 1; i < rowCount; i++) { for (let j = 1; j < colCount ; j++) { // Remove the quotes from your array current = csvArray[i][j].replace(/"/g, ''); // Added the Method IsNullOrWhiteSpace if (!isNullOrWhitespace(current)) { // Parse as double not int to account for dec. values sum[j] += Number(current); count[j]++; } } } for (let i = 0; i < colCount; i++) { average.push((sum[i] + 0.0) / count[i]); } // I added this line: dictionary = {}; for (let i = 1; i < colCount; i++) { dictionary[headers[i]] = average[i]; } return dictionary; } Let me know if this works out for you. You can loop through the values with: for (let key in dictionary) {console.log("key: " + key + " , value: " + dictionary[key]);} . Regards!
longest substring of non repeating characters javascript
The problems asks "given a string, find the longest non-repeating sub-string without repeating characters". I am a little stumped why returning my code is not working for the string "dvdf" for example. Here is my code : function lengthOfLongestSubstring(check) { var letters = check.split(""); var max = 0; var result = []; for (var i = 0; i < letters.length; i++) { var start = i if (result.indexOf(letters[i]) === -1) { result.push(letters[i]) } else { i = i - 1 result = [] } if (max === 0 || max < result.length) { max = result.length } } return max }
This implementation gives the correct result for "dvdf". It adds characters to current_string while there is no duplicate. When you find a duplicate cut current_string to the point of the duplicate. max is the max length current_string had at any time. This logic seems correct to me so I think it's correct. function lengthOfLongestSubstring(string) { var max = 0, current_string = "", i, char, pos; for (i = 0; i < string.length; i += 1) { char = string.charAt(i); pos = current_string.indexOf(char); if (pos !== -1) { // cut "dv" to "v" when you see another "d" current_string = current_string.substr(pos + 1); } current_string += char; max = Math.max(max, current_string.length); } return max; } lengthOfLongestSubstring("dvdf"); // 3 The value of current_string in each round is "", "d", "dv", "vd", "vdf".
By replacing the result array with a map storing the last index for each encountered character, you can modify the loop body to jump back to one after the last index of an identical character and continue your search from there instead of just restarting from the current position via currently i = i - 1 which fails in cases such as 'dvdf': Below is your code with changes to accommodate a map in place of an array: function lengthOfLongestSubstring(check) { var letters = check.split(""); var max = 0; var result = new Map(); var start = 0; for (var i = 0; i < letters.length; i++) { if (!result.has(letters[i])) { result.set(letters[i], i); } else { i = result.get(letters[i]); result.clear(); } if (max < result.size) { max = result.size; } } return max; } // Example: console.log(lengthOfLongestSubstring("dvdf")); // 3
Here's a solution using Sliding window and HashMap. var lengthOfLongestSubstring = function(str) { if (!!!str.length || typeof str !== 'string') return 0; if (str.length == 1) return 1; let hashTable = {}; let longestSubstringLength = 0; let start = 0; for (let i = 0; i < str.length; i++) { if (hashTable[str[i]] !== undefined && hashTable[str[i]] >= start) { start = hashTable[str[i]] + 1; } hashTable[str[i]] = i; longestSubstringLength = Math.max(longestSubstringLength, (i - start + 1)) } return longestSubstringLength; }
I figured out an easier solution: function longestSubstring(str) { let left = 0; let max = 0; let result = new Set(); for (let r = 0; r < str.length; r++) { //The code will check for an existing item on the set // If found, all the previously saved items will be deleted // the set will return to being empty while (result.has(str[r])) { result.delete(str[left]); left += 1; } result.add(str[r]); max = Math.max(max, r - left + 1); } console.log(result); return max; } console.log(longestSubstring('abcabccbc')); //3
Today (January 7th, 2021) this was the Leetcode question of the day. I initially used a solution very similar to the selected answer. Performance was okay but after reviewing the answer solution documentation I rewrote my answer using the sliding window technique (examples were only in Java and Python) since I was curious about how much of a performance improvement this would result in. It is slightly more performant (144ms versus 160ms) and has a lower memory footprint (42mb versus 44.9mb): function lengthOfLongestSubstring(s: string): number { let stringLength = s.length; let maxLength = 0; const charMap = new Map(); let pos = 0; for (let i = 0; i < stringLength; i++) { if (charMap.has(s[i])) { pos = Math.max(charMap.get(s[i]), pos); } maxLength = Math.max(maxLength, i - pos + 1); charMap.set(s[i], i + 1); } return maxLength; } console.log(lengthOfLongestSubstring("dvdf"));
Try this: function lengthOfLongestSubstring (str) { const map = new Map(); let max = 0; let left = 0; for (let right = 0; right < str.length; right++) { const char = str[right]; if (map.get(char) >= left) left = map.get(char) + 1; else max = Math.max(max, right - left + 1); map.set(char, right); } return max; }
You can try this: function lengthOfLongestSubstring(str) { let longest = ""; for (let i = 0; i < str.length; i++) { if (longest.includes(str[i])) { return longest.length } else { longest += str[i]; } } return longest.length; } console.log(lengthOfLongestSubstring("abcabcbb")); console.log(lengthOfLongestSubstring("bbbbb")); console.log(lengthOfLongestSubstring("abcdef")); console.log(lengthOfLongestSubstring(""));
reset i to i -1 is incorrect. you need another loop inside the for loop. you try something like this (i didn't check the index carefully). function lengthOfLongestSubstring(check){ var letters = check.split(""); var max = 0; for (var i = 0; i < letters.length; i++) { var result = []; var j = i; for(;j < letters.length; j++) { if (result.indexOf(letters[j]) === -1) { result.push(letters[j]); } else { break; } } if(j - i > max) { max = j - i; } } return max; }
You can try sliding window pattern to solve this problem. function lengthOfLongestSubstring(str) { let longest = 0; let longestStr = ""; let seen = {}; let start = 0; let next = 0; while (next < str.length) { // Take current character from string let char = str[next]; // If current character is already present in map if (seen[char]) { // Check if start index is greater than current character's last index start = Math.max(start, seen[char]); } // If new substring is longer than older if (longest < next - start + 1) { longest = next - start + 1; // Take slice of longer substring longestStr = str.slice(start, next + 1); } // Update current characters index seen[char] = next + 1; // Move to next character next++; } console.log(str, "->", longestStr, "->", longest); return longest; } lengthOfLongestSubstring("dvdfvev"); lengthOfLongestSubstring("hello"); lengthOfLongestSubstring("1212312344");
Find Longest Unique Substring using Map Method var str = "aaabcbdeaf"; var start = 0; var map = new Map(); var maxLength = 0; var longStr = ''; for(next =0; next< str.length ; next++){ if(map.has(str[next])){ map.set(str[next],map.get(str[next])+1); start = Math.max(start,map.get(str[next])); } if(maxLength < next-start+1){ maxLength = next-start+1; longStr = str.slice(start,next+1); } map.set(str[next],next); } console.log(longStr);
You can try something like that: function maxSubstring(s) { const array = [] const lengthS = s.length const pusher = (value) => { if (value !== '') { if (array.length > 0) { if (array.indexOf(value) === -1) { array.push(value) } } else { array.push(value) } } } pusher(s) for (const [index, value] of s.split('').entries()) { let length = lengthS let string = s const indexO = s.indexOf(value) pusher(value) while (length > indexO) { pusher(string.slice(index-1, length + 1)) length = --length } string = s.slice(index, lengthS) } array.sort() return array.pop() } console.log(maxSubstring('banana')) console.log(maxSubstring('fgjashore')) console.log(maxSubstring('xyzabcd'))
Find Longest unique substring without using MAP(). Just simple slice(). The same can be used to return longest unique string. Just replace "return max => return str" const string = "dvdf"; var lengthOfLongestSubstring = function() { if(string.length == 1) return 1; if(string.length == 0) return 0; let max = 0,i = 0, str = ""; while(i < string.length){ const index = str.indexOf(string.charAt(i)); if(index > -1) { // s = "fiterm".slice(1,4) => ite str = str.slice(index + 1, string.length); } str += string.charAt(i); max = Math.max(str.length, max); i++; } return max; };
Logest unqiue substring: function lengthOfLongestSubstring(s) { if(s.length < 2) { return s.length; } let longestLength = 1; let currentStr = ''; for(let i=0 ; i < s.length ; i++){ if(currentStr.includes(s.charAt(i))){ let firstSeen = currentStr.indexOf(s.charAt(i)); currentStr = currentStr.substring(firstSeen+1,currentStr.length); } currentStr += s.charAt(i); longestLength = Math.max(currentStr.length,longestLength); } return longestLength; };
One liner with reduce method. const subStrOfUniqueChar = str => [...str].reduce((p,c) => ( p.includes(c) ? (p += c, p.substr(p.indexOf(c)+1)) : p += c),''); console.log(subStrOfUniqueChar('dvdf').length);
function lengthOfLongestSubstring(s: string): number { const arr = s.split(""); let longest = 0; const set: Set<string> = new Set(); for (let i = 0; i < arr.length; i++) { set.add(arr[i]); let tryIndex = i + 1; while (arr[tryIndex] && !set.has(arr[tryIndex])) { set.add(arr[tryIndex]); tryIndex++; } if (set.size > longest) { longest = set.size; } set.clear(); } return longest; }
I wanted to toss my hat in this ring because I feel like I've found a pretty creative solution to this. No if/else blocks are needed as the substring.indexOf() will attempt to find the matching string character in the array and delete the indexes of the array up to, and including, the match (+1). If an indexOf() call finds no match it will return a -1, which added to +1 becomes a .splice(0,0) which will remove nothing. The final Math check factors in the last character addition in the loop to determine which outcome is higher. const findSubstring = string => { let substring = []; let maxCount = 0; for (let i = 0; i < string.length; i++) { maxCount = Math.max(substring.length, maxCount); substring.splice(0, substring.indexOf(string[i]) + 1); substring.push(string[i]); } maxCount = Math.max(substring.length, maxCount); return maxCount; }
uses sliding window concept function lengthOfLongestSubstring(s) { var letters = s.split(""); var subStr = ""; var result = []; var len = 0; let maxLen = 0; for (var i = 0; i < letters.length; i++) { const position = result.indexOf(letters[i]); if (position === -1) { result.push(letters[i]); len += 1; } else if (letters[i]) { result = result.splice(position + 1); len = result.length + 1; result.push(letters[i]); } maxLen = len > maxLen ? len : maxLen; } return maxLen; } console.log(lengthOfLongestSubstring(" "));
Sliding Window Technique O(n) you can use hash or Map in loop through string char Maintain dictionary of unique char if char exist in memory take clear hash update the count in longest variable and clear count start from first repeated char + 1 again. var lengthOfLongestSubstring = function(s) { if(s.length<2) return s.length; let longest = 0; let count=0; let hash={} for (let i = 0; i < s.length; i++) { //If char exist in hash if(hash[s[i]]!=undefined){ i=hash[s[i]]; hash={} longest = Math.max(longest, count); count = 0; }else{ hash[s[i]]=i count = count+1; } } return Math.max(longest, count); }; console.log(lengthOfLongestSubstring("abcabcbb")) console.log(lengthOfLongestSubstring("au"))
Project Euler - 67
I was working through problem 67 on Project Euler, and this is the following code I used: (sorry if kind of messy var everything = [59,73,41,52,40,09,26,53,06,34,10,51,87,86,81,61,95,66,57,25,68,90,81,80,38,92,67,73,30,28,51,76,81,18,75,44,84,14,95,87,62,81,17,78,58,21,46,71,58,02,79,62,39,31,09,56,34,35,53,78,31,81,18,90,93,15,78,53,04,21,84,93,32,13,97,11,37,51,45,03,81,79,05,18,78,86,13,30,63,99,95,39,87,96,28,03,38,42,17,82,87,58,07,22,57,06,17,51,17,07,93,09,07,75,97,95,78,87,08,53,67,66,59,60,88,99,94,65,55,77,55,34,27,53,78,28,76,40,41,04,87,16,09,42,75,69,23,97,30,60,10,79,87,12,10,44,26,21,36,32,84,98,60,13,12,36,16,63,31,91,35,70,39,06,05,55,27,38,48,28,22,34,35,62,62,15,14,94,89,86,66,56,68,84,96,21,34,34,34,81,62,40,65,54,62,05,98,03,02,60,38,89,46,37,99,54,34,53,36,14,70,26,02,90,45,13,31,61,83,73,47,36,10,63,96,60,49,41,05,37,42,14,58,84,93,96,17,09,43,05,43,06,59,66,57,87,57,61,28,37,51,84,73,79,15,39,95,88,87,43,39,11,86,77,74,18,54,42,05,79,30,49,99,73,46,37,50,02,45,09,54,52,27,95,27,65,19,45,26,45,71,39,17,78,76,29,52,90,18,99,78,19,35,62,71,19,23,65,93,85,49,33,75,09,02,33,24,47,61,60,55,32,88,57,55,91,54,46,57,07,77,98,52,80,99,24,25,46,78,79,05,92,09,13,55,10,67,26,78,76,82,63,49,51,31,24,68,05,57,07,54,69,21,67,43,17,63,12,24,59,06,08,98,74,66,26,61,60,13,03,09,09,24,30,71,08,88,70,72,70,29,90,11,82,41,34,66,82,67,04,36,60,92,77,91,85,62,49,59,61,30,90,29,94,26,41,89,04,53,22,83,41,09,74,90,48,28,26,37,28,52,77,26,51,32,18,98,79,36,62,13,17,08,19,54,89,29,73,68,42,14,08,16,70,37,37,60,69,70,72,71,09,59,13,60,38,13,57,36,09,30,43,89,30,39,15,02,44,73,05,73,26,63,56,86,12,55,55,85,50,62,99,84,77,28,85,03,21,27,22,19,26,82,69,54,04,13,07,85,14,01,15,70,59,89,95,10,19,04,09,31,92,91,38,92,86,98,75,21,05,64,42,62,84,36,20,73,42,21,23,22,51,51,79,25,45,85,53,03,43,22,75,63,02,49,14,12,89,14,60,78,92,16,44,82,38,30,72,11,46,52,90,27,08,65,78,03,85,41,57,79,39,52,33,48,78,27,56,56,39,13,19,43,86,72,58,95,39,07,04,34,21,98,39,15,39,84,89,69,84,46,37,57,59,35,59,50,26,15,93,42,89,36,27,78,91,24,11,17,41,05,94,07,69,51,96,03,96,47,90,90,45,91,20,50,56,10,32,36,49,04,53,85,92,25,65,52,09,61,30,61,97,66,21,96,92,98,90,06,34,96,60,32,69,68,33,75,84,18,31,71,50,84,63,03,03,19,11,28,42,75,45,45,61,31,61,68,96,34,49,39,05,71,76,59,62,67,06,47,96,99,34,21,32,47,52,07,71,60,42,72,94,56,82,83,84,40,94,87,82,46,01,20,60,14,17,38,26,78,66,81,45,95,18,51,98,81,48,16,53,88,37,52,69,95,72,93,22,34,98,20,54,27,73,61,56,63,60,34,63,93,42,94,83,47,61,27,51,79,79,45,01,44,73,31,70,83,42,88,25,53,51,30,15,65,94,80,44,61,84,12,77,02,62,02,65,94,42,14,94,32,73,09,67,68,29,74,98,10,19,85,48,38,31,85,67,53,93,93,77,47,67,39,72,94,53,18,43,77,40,78,32,29,59,24,06,02,83,50,60,66,32,01,44,30,16,51,15,81,98,15,10,62,86,79,50,62,45,60,70,38,31,85,65,61,64,06,69,84,14,22,56,43,09,48,66,69,83,91,60,40,36,61,92,48,22,99,15,95,64,43,01,16,94,02,99,19,17,69,11,58,97,56,89,31,77,45,67,96,12,73,08,20,36,47,81,44,50,64,68,85,40,81,85,52,09,91,35,92,45,32,84,62,15,19,64,21,66,06,01,52,80,62,59,12,25,88,28,91,50,40,16,22,99,92,79,87,51,21,77,74,77,07,42,38,42,74,83,02,05,46,19,77,66,24,18,05,32,02,84,31,99,92,58,96,72,91,36,62,99,55,29,53,42,12,37,26,58,89,50,66,19,82,75,12,48,24,87,91,85,02,07,03,76,86,99,98,84,93,07,17,33,61,92,20,66,60,24,66,40,30,67,05,37,29,24,96,03,27,70,62,13,04,45,47,59,88,43,20,66,15,46,92,30,04,71,66,78,70,53,99,67,60,38,06,88,04,17,72,10,99,71,07,42,25,54,05,26,64,91,50,45,71,06,30,67,48,69,82,08,56,80,67,18,46,66,63,01,20,08,80,47,07,91,16,03,79,87,18,54,78,49,80,48,77,40,68,23,60,88,58,80,33,57,11,69,55,53,64,02,94,49,60,92,16,35,81,21,82,96,25,24,96,18,02,05,49,03,50,77,06,32,84,27,18,38,68,01,50,04,03,21,42,94,53,24,89,05,92,26,52,36,68,11,85,01,04,42,02,45,15,06,50,04,53,73,25,74,81,88,98,21,67,84,79,97,99,20,95,04,40,46,02,58,87,94,10,02,78,88,52,21,03,88,60,06,53,49,71,20,91,12,65,07,49,21,22,11,41,58,99,36,16,09,48,17,24,52,36,23,15,72,16,84,56,02,99,43,76,81,71,29,39,49,17,64,39,59,84,86,16,17,66,03,09,43,06,64,18,63,29,68,06,23,07,87,14,26,35,17,12,98,41,53,64,78,18,98,27,28,84,80,67,75,62,10,11,76,90,54,10,05,54,41,39,66,43,83,18,37,32,31,52,29,95,47,08,76,35,11,04,53,35,43,34,10,52,57,12,36,20,39,40,55,78,44,07,31,38,26,08,15,56,88,86,01,52,62,10,24,32,05,60,65,53,28,57,99,03,50,03,52,07,73,49,92,66,80,01,46,08,67,25,36,73,93,07,42,25,53,13,96,76,83,87,90,54,89,78,22,78,91,73,51,69,09,79,94,83,53,09,40,69,62,10,79,49,47,03,81,30,71,54,73,33,51,76,59,54,79,37,56,45,84,17,62,21,98,69,41,95,65,24,39,37,62,03,24,48,54,64,46,82,71,78,33,67,09,16,96,68,52,74,79,68,32,21,13,78,96,60,09,69,20,36,73,26,21,44,46,38,17,83,65,98,07,23,52,46,61,97,33,13,60,31,70,15,36,77,31,58,56,93,75,68,21,36,69,53,90,75,25,82,39,50,65,94,29,30,11,33,11,13,96,02,56,47,07,49,02,76,46,73,30,10,20,60,70,14,56,34,26,37,39,48,24,55,76,84,91,39,86,95,61,50,14,53,93,64,67,37,31,10,84,42,70,48,20,10,72,60,61,84,79,69,65,99,73,89,25,85,48,92,56,97,16,03,14,80,27,22,30,44,27,67,75,79,32,51,54,81,29,65,14,19,04,13,82,04,91,43,40,12,52,29,99,07,76,60,25,01,07,61,71,37,92,40,47,99,66,57,01,43,44,22,40,53,53,09,69,26,81,07,49,80,56,90,93,87,47,13,75,28,87,23,72,79,32,18,27,20,28,10,37,59,21,18,70,04,79,96,03,31,45,71,81,06,14,18,17,05,31,50,92,79,23,47,09,39,47,91,43,54,69,47,42,95,62,46,32,85,37,18,62,85,87,28,64,05,77,51,47,26,30,65,05,70,65,75,59,80,42,52,25,20,44,10,92,17,71,95,52,14,77,13,24,55,11,65,26,91,01,30,63,15,49,48,41,17,67,47,03,68,20,90,98,32,04,40,68,90,51,58,60,06,55,23,68,05,19,76,94,82,36,96,43,38,90,87,28,33,83,05,17,70,83,96,93,06,04,78,47,80,06,23,84,75,23,87,72,99,14,50,98,92,38,90,64,61,58,76,94,36,66,87,80,51,35,61,38,57,95,64,06,53,36,82,51,40,33,47,14,07,98,78,65,39,58,53,06,50,53,04,69,40,68,36,69,75,78,75,60,03,32,39,24,74,47,26,90,13,40,44,71,90,76,51,24,36,50,25,45,70,80,61,80,61,43,90,64,11,18,29,86,56,68,42,79,10,42,44,30,12,96,18,23,18,52,59,02,99,67,46,60,86,43,38,55,17,44,93,42,21,55,14,47,34,55,16,49,24,23,29,96,51,55,10,46,53,27,92,27,46,63,57,30,65,43,27,21,20,24,83,81,72,93,19,69,52,48,01,13,83,92,69,20,48,69,59,20,62,05,42,28,89,90,99,32,72,84,17,08,87,36,03,60,31,36,36,81,26,97,36,48,54,56,56,27,16,91,08,23,11,87,99,33,47,02,14,44,73,70,99,43,35,33,90,56,61,86,56,12,70,59,63,32,01,15,81,47,71,76,95,32,65,80,54,70,34,51,40,45,33,04,64,55,78,68,88,47,31,47,68,87,03,84,23,44,89,72,35,08,31,76,63,26,90,85,96,67,65,91,19,14,17,86,04,71,32,95,37,13,04,22,64,37,37,28,56,62,86,33,07,37,10,44,52,82,52,06,19,52,57,75,90,26,91,24,06,21,14,67,76,30,46,14,35,89,89,41,03,64,56,97,87,63,22,34,03,79,17,45,11,53,25,56,96,61,23,18,63,31,37,37,47,77,23,26,70,72,76,77,04,28,64,71,69,14,85,96,54,95,48,06,62,99,83,86,77,97,75,71,66,30,19,57,90,33,01,60,61,14,12,90,99,32,77,56,41,18,14,87,49,10,14,90,64,18,50,21,74,14,16,88,05,45,73,82,47,74,44,22,97,41,13,34,31,54,61,56,94,03,24,59,27,98,77,04,09,37,40,12,26,87,09,71,70,07,18,64,57,80,21,12,71,83,94,60,39,73,79,73,19,97,32,64,29,41,07,48,84,85,67,12,74,95,20,24,52,41,67,56,61,29,93,35,72,69,72,23,63,66,01,11,07,30,52,56,95,16,65,26,83,90,50,74,60,18,16,48,43,77,37,11,99,98,30,94,91,26,62,73,45,12,87,73,47,27,01,88,66,99,21,41,95,80,02,53,23,32,61,48,32,43,43,83,14,66,95,91,19,81,80,67,25,88,08,62,32,18,92,14,83,71,37,96,11,83,39,99,05,16,23,27,10,67,02,25,44,11,55,31,46,64,41,56,44,74,26,81,51,31,45,85,87,09,81,95,22,28,76,69,46,48,64,87,67,76,27,89,31,11,74,16,62,03,60,94,42,47,09,34,94,93,72,56,18,90,18,42,17,42,32,14,86,06,53,33,95,99,35,29,15,44,20,49,59,25,54,34,59,84,21,23,54,35,90,78,16,93,13,37,88,54,19,86,67,68,55,66,84,65,42,98,37,87,56,33,28,58,38,28,38,66,27,52,21,81,15,08,22,97,32,85,27,91,53,40,28,13,34,91,25,01,63,50,37,22,49,71,58,32,28,30,18,68,94,23,83,63,62,94,76,80,41,90,22,82,52,29,12,18,56,10,08,35,14,37,57,23,65,67,40,72,39,93,39,70,89,40,34,07,46,94,22,20,05,53,64,56,30,05,56,61,88,27,23,95,11,12,37,69,68,24,66,10,87,70,43,50,75,07,62,41,83,58,95,93,89,79,45,39,02,22,05,22,95,43,62,11,68,29,17,40,26,44,25,71,87,16,70,85,19,25,59,94,90,41,41,80,61,70,55,60,84,33,95,76,42,63,15,09,03,40,38,12,03,32,09,84,56,80,61,55,85,97,16,94,82,94,98,57,84,30,84,48,93,90,71,05,95,90,73,17,30,98,40,64,65,89,07,79,09,19,56,36,42,30,23,69,73,72,07,05,27,61,24,31,43,48,71,84,21,28,26,65,65,59,65,74,77,20,10,81,61,84,95,08,52,23,70,47,81,28,09,98,51,67,64,35,51,59,36,92,82,77,65,80,24,72,53,22,07,27,10,21,28,30,22,48,82,80,48,56,20,14,43,18,25,50,95,90,31,77,08,09,48,44,80,90,22,93,45,82,17,13,96,25,26,08,73,34,99,06,49,24,06,83,51,40,14,15,10,25,01,54,25,10,81,30,64,24,74,75,80,36,75,82,60,22,69,72,91,45,67,03,62,79,54,89,74,44,83,64,96,66,73,44,30,74,50,37,05,09,97,70,01,60,46,37,91,39,75,75,18,58,52,72,78,51,81,86,52,08,97,01,46,43,66,98,62,81,18,70,93,73,08,32,46,34,96,80,82,07,59,71,92,53,19,20,88,66,03,26,26,10,24,27,50,82,94,73,63,08,51,33,22,45,19,13,58,33,90,15,22,50,36,13,55,06,35,47,82,52,33,61,36,27,28,46,98,14,73,20,73,32,16,26,80,53,47,66,76,38,94,45,02,01,22,52,47,96,64,58,52,39,88,46,23,39,74,63,81,64,20,90,33,33,76,55,58,26,10,46,42,26,74,74,12,83,32,43,09,02,73,55,86,54,85,34,28,23,29,79,91,62,47,41,82,87,99,22,48,90,20,05,96,75,95,04,43,28,81,39,81,01,28,42,78,25,39,77,90,57,58,98,17,36,73,22,63,74,51,29,39,74,94,95,78,64,24,38,86,63,87,93,06,70,92,22,16,80,64,29,52,20,27,23,50,14,13,87,15,72,96,81,22,08,49,72,30,70,24,79,31,16,64,59,21,89,34,96,91,48,76,43,53,88,01,57,80,23,81,90,79,58,01,80,87,17,99,86,90,72,63,32,69,14,28,88,69,37,17,71,95,56,93,71,35,43,45,04,98,92,94,84,96,11,30,31,27,31,60,92,03,48,05,98,91,86,94,35,90,90,08,48,19,33,28,68,37,59,26,65,96,50,68,22,07,09,49,34,31,77,49,43,06,75,17,81,87,61,79,52,26,27,72,29,50,07,98,86,01,17,10,46,64,24,18,56,51,30,25,94,88,85,79,91,40,33,63,84,49,67,98,92,15,26,75,19,82,05,18,78,65,93,61,48,91,43,59,41,70,51,22,15,92,81,67,91,46,98,11,11,65,31,66,10,98,65,83,21,05,56,05,98,73,67,46,74,69,34,08,30,05,52,07,98,32,95,30,94,65,50,24,63,28,81,99,57,19,23,61,36,09,89,71,98,65,17,30,29,89,26,79,74,94,11,44,48,97,54,81,55,39,66,69,45,28,47,13,86,15,76,74,70,84,32,36,33,79,20,78,14,41,47,89,28,81,05,99,66,81,86,38,26,06,25,13,60,54,55,23,53,27,05,89,25,23,11,13,54,59,54,56,34,16,24,53,44,06,13,40,57,72,21,15,60,08,04,19,11,98,34,45,09,97,86,71,03,15,56,19,15,44,97,31,90,04,87,87,76,08,12,30,24,62,84,28,12,85,82,53,99,52,13,94,06,65,97,86,09,50,94,68,69,74,30,67,87,94,63,07,78,27,80,36,69,41,06,92,32,78,37,82,30,05,18,87,99,72,19,99,44,20,55,77,69,91,27,31,28,81,80,27,02,07,97,23,95,98,12,25,75,29,47,71,07,47,78,39,41,59,27,76,13,15,66,61,68,35,69,86,16,53,67,63,99,85,41,56,08,28,33,40,94,76,90,85,31,70,24,65,84,65,99,82,19,25,54,37,21,46,33,02,52,99,51,33,26,04,87,02,08,18,96,54,42,61,45,91,06,64,79,80,82,32,16,83,63,42,49,19,78,65,97,40,42,14,61,49,34,04,18,25,98,59,30,82,72,26,88,54,36,21,75,03,88,99,53,46,51,55,78,22,94,34,40,68,87,84,25,30,76,25,08,92,84,42,61,40,38,09,99,40,23,29,39,46,55,10,90,35,84,56,70,63,23,91,39,52,92,03,71,89,07,09,37,68,66,58,20,44,92,51,56,13,71,79,99,26,37,02,06,16,67,36,52,58,16,79,73,56,60,59,27,44,77,94,82,20,50,98,33,09,87,94,37,40,83,64,83,58,85,17,76,53,02,83,52,22,27,39,20,48,92,45,21,09,42,24,23,12,37,52,28,50,78,79,20,86,62,73,20,59,54,96,80,15,91,90,99,70,10,09,58,90,93,50,81,99,54,38,36,10,30,11,35,84,16,45,82,18,11,97,36,43,96,79,97,65,40,48,23,19,17,31,64,52,65,65,37,32,65,76,99,79,34,65,79,27,55,33,03,01,33,27,61,28,66,08,04,70,49,46,48,83,01,45,19,96,13,81,14,21,31,79,93,85,50,05,92,92,48,84,59,98,31,53,23,27,15,22,79,95,24,76,05,79,16,93,97,89,38,89,42,83,02,88,94,95,82,21,01,97,48,39,31,78,09,65,50,56,97,61,01,07,65,27,21,23,14,15,80,97,44,78,49,35,33,45,81,74,34,05,31,57,09,38,94,07,69,54,69,32,65,68,46,68,78,90,24,28,49,51,45,86,35,41,63,89,76,87,31,86,09,46,14,87,82,22,29,47,16,13,10,70,72,82,95,48,64,58,43,13,75,42,69,21,12,67,13,64,85,58,23,98,09,37,76,05,22,31,12,66,50,29,99,86,72,45,25,10,28,19,06,90,43,29,31,67,79,46,25,74,14,97,35,76,37,65,46,23,82,06,22,30,76,93,66,94,17,96,13,20,72,63,40,78,08,52,09,90,41,70,28,36,14,46,44,85,96,24,52,58,15,87,37,05,98,99,39,13,61,76,38,44,99,83,74,90,22,53,80,56,98,30,51,63,39,44,30,91,91,04,22,27,73,17,35,53,18,35,45,54,56,27,78,48,13,69,36,44,38,71,25,30,56,15,22,73,43,32,69,59,25,93,83,45,11,34,94,44,39,92,12,36,56,88,13,96,16,12,55,54,11,47,19,78,17,17,68,81,77,51,42,55,99,85,66,27,81,79,93,42,65,61,69,74,14,01,18,56,12,01,58,37,91,22,42,66,83,25,19,04,96,41,25,45,18,69,96,88,36,93,10,12,98,32,44,83,83,04,72,91,04,27,73,07,34,37,71,60,59,31,01,54,54,44,96,93,83,36,04,45,30,18,22,20,42,96,65,79,17,41,55,69,94,81,29,80,91,31,85,25,47,26,43,49,02,99,34,67,99,76,16,14,15,93,08,32,99,44,61,77,67,50,43,55,87,55,53,72,17,46,62,25,50,99,73,05,93,48,17,31,70,80,59,09,44,59,45,13,74,66,58,94,87,73,16,14,85,38,74,99,64,23,79,28,71,42,20,37,82,31,23,51,96,39,65,46,71,56,13,29,68,53,86,45,33,51,49,12,91,21,21,76,85,02,17,98,15,46,12,60,21,88,30,92,83,44,59,42,50,27,88,46,86,94,73,45,54,23,24,14,10,94,21,20,34,23,51,04,83,99,75,90,63,60,16,22,33,83,70,11,32,10,50,29,30,83,46,11,05,31,17,86,42,49,01,44,63,28,60,07,78,95,40,44,61,89,59,04,49,51,27,69,71,46,76,44,04,09,34,56,39,15,06,94,91,75,90,65,27,56,23,74,06,23,33,36,69,14,39,05,34,35,57,33,22,76,46,56,10,61,65,98,09,16,69,04,62,65,18,99,76,49,18,72,66,73,83,82,40,76,31,89,91,27,88,17,35,41,35,32,51,32,67,52,68,74,85,80,57,07,11,62,66,47,22,67,65,37,19,97,26,17,16,24,24,17,50,37,64,82,24,36,32,11,68,34,69,31,32,89,79,93,96,68,49,90,14,23,04,04,67,99,81,74,70,74,36,96,68,09,64,39,88,35,54,89,96,58,66,27,88,97,32,14,06,35,78,20,71,06,85,66,57,02,58,91,72,05,29,56,73,48,86,52,09,93,22,57,79,42,12,01,31,68,17,59,63,76,07,77,73,81,14,13,17,20,11,09,01,83,08,85,91,70,84,63,62,77,37,07,47,01,59,95,39,69,39,21,99,09,87,02,97,16,92,36,74,71,90,66,33,73,73,75,52,91,11,12,26,53,05,26,26,48,61,50,90,65,01,87,42,47,74,35,22,73,24,26,56,70,52,05,48,41,31,18,83,27,21,39,80,85,26,08,44,02,71,07,63,22,05,52,19,08,20,17,25,21,11,72,93,33,49,64,23,53,82,03,13,91,65,85,02,40,05,42,31,77,42,05,36,06,54,04,58,07,76,87,83,25,57,66,12,74,33,85,37,74,32,20,69,03,97,91,68,82,44,19,14,89,28,85,85,80,53,34,87,58,98,88,78,48,65,98,40,11,57,10,67,70,81,60,79,74,72,97,59,79,47,30,20,54,80,89,91,14,05,33,36,79,39,60,85,59,39,60,07,57,76,77,92,06,35,15,72,23,41,45,52,95,18,64,79,86,53,56,31,69,11,91,31,84,50,44,82,22,81,41,40,30,42,30,91,48,94,74,76,64,58,74,25,96,57,14,19,03,99,28,83,15,75,99,01,89,85,79,50,03,95,32,67,44,08,07,41,62,64,29,20,14,76,26,55,48,71,69,66,19,72,44,25,14,01,48,74,12,98,07,64,66,84,24,18,16,27,48,20,14,47,69,30,86,48,40,23,16,61,21,51,50,26,47,35,33,91,28,78,64,43,68,04,79,51,08,19,60,52,95,06,68,46,86,35,97,27,58,04,65,30,58,99,12,12,75,91,39,50,31,42,64,70,04,46,07,98,73,98,93,37,89,77,91,64,71,64,65,66,21,78,62,81,74,42,20,83,70,73,95,78,45,92,27,34,53,71,15,30,11,85,31,34,71,13,48,05,14,44,03,19,67,23,73,19,57,06,90,94,72,57,69,81,62,59,68,88,57,55,69,49,13,07,87,97,80,89,05,71,05,05,26,38,40,16,62,45,99,18,38,98,24,21,26,62,74,69,04,85,57,77,35,58,67,91,79,79,57,86,28,66,34,72,51,76,78,36,95,63,90,08,78,47,63,45,31,22,70,52,48,79,94,15,77,61,67,68,23,33,44,81,80,92,93,75,94,88,23,61,39,76,22,03,28,94,32,06,49,65,41,34,18,23,08,47,62,60,03,63,33,13,80,52,31,54,73,43,70,26,16,69,57,87,83,31,03,93,70,81,47,95,77,44,29,68,39,51,56,59,63,07,25,70,07,77,43,53,64,03,94,42,95,39,18,01,66,21,16,97,20,50,90,16,70,10,95,69,29,06,25,61,41,26,15,59,63,35]; function getRow(row) { if(row == 1) return 59; else { var num = 0; var array = []; for(var i = 1;i < row;i ++) { num += i; } for(var i = 0;i < row;i ++) { array = array.concat(everything[i + num]) } return array; } } function pickHighest(lastnumplace, lastrow) { var highest = []; var row = getRow(lastrow + 1); highest = highest.concat(Math.max(row[lastnumplace - 1], row[lastnumplace])); highest = highest.concat(lastrow + 1); if(Math.max(row[lastnumplace - 1], row[lastnumplace]) == row[lastnumplace - 1]) highest = highest.concat(lastnumplace); else highest = highest.concat(lastnumplace + 1); return highest; } var sum = 0; var highest; for(var i = 1;i <= 100;i ++) { if(i == 1) { highest = [59, 1, 1]; sum += 59; } else { highest = pickHighest(highest[2], i - 1); sum += highest[0]; } document.write(sum + " " + highest + "<br>"); } alert(sum); alert(i); For some strange reason, I always get 6580. https://projecteuler.net/problem=67 Help?
In 'getRow' function you are adding all row elements in the loop, but it is not increasing by the number of elements as you wrote but '2^row number' - you just summed the elements from the previous row. From row 3 it will not work.