Sword finger offer week 5 incomplete
73. Two numbers that only appear once in the array
Except for two numbers in an integer array, other numbers appear twice.
Please write a program to find out the two numbers that only appear once.
You can assume that these two numbers must exist.
Example
Input: [1,2,3,3,4,4] Output: [1,2]
Only two numbers appear once in the array, and the rest appear twice.
According to a ^ a = 0, if all the numbers in the array are exclusive or, the exclusive exclusive exclusive or of two numbers will be obtained;
Then group them according to the bits;
class Solution { public int[] findNumsAppearOnce(int[] nums) { int res = 0; for(int num : nums)res ^= num; res &= (-res); int[] ans = new int[2]; for(int i : nums){ if((i & res) == res) ans[0] ^= i; else ans[1] ^= i; } return ans; } }
74. The only number in the array that only appears once
In an array, all numbers appear three times except one.
Please find out the number that only appears once.
You can assume that the number that meets the condition must exist.
Thinking questions:
- If only O(n)O(n) time and extra O(1)O(1) space are required, what should be done?
Example
Input: [1,1,1,2,2,2,3,4,4,4] Output: 3
Method 1: divide all numbers in nums array into different digits. One number appears once and the rest three times. The number of times other numbers appear on its digits must be three;
For example: 3-11, then 3 must appear 3 times at 0 and 1
In 5-101, the last digit appears six times, the middle three times, and the first three times; if there is only one number, the balance will be broken, and it is no longer a multiple of three
class Solution { public int findNumberAppearingOnce(int[] nums) { // Record the number of 1 in each bit int[] count = new int[32]; for(int num : nums){ for(int i = 0; i < 32; i ++){ count[i] += num & 1; num >>>= 1; } } int res = 0, m = 3; // Take 1 from the bit whose occurrence times are not integral multiples of 3; for(int i = 0; i < 32; i ++){ res <<= 1; // If there is 4 or 1 level, this is 1 for res; res |= count[31 - i] % m; } return res; } }
75. And are two numbers of S
Enter an array and a number s, and look up two numbers in the array so that their sum is exactly s.
If the sum of many pairs of numbers is equal to s, output any pair.
You can think of each input as having at least one set of outputs that meet the criteria.
Example
Input: [1,2,3,4], sum = 7 Output: [3,4]
Using ma to store the number needed for each value
class Solution { public int[] findNumbersWithSum(int[] nums, int target) { Map<Integer,Integer> map = new HashMap<>(); for(int num : nums){ int need = target - num; Integer temp = map.get(need); if(temp == null)map.put(num,need); else return new int[] {need,temp}; } return null; } }
76. Continuous positive sequence with sum as S
Enter a positive number s and print out all the continuous positive number sequences with sum s (at least two numbers).
For example, input 15, because 1 + 2 + 3 + 4 + 5 = 4 + 5 + 6 = 7 + 8 = 15, the result prints out three consecutive sequences 1-5, 4-6 and 7-8.
Example
Input: 15 Output: [[1,2,3,4,5], [4,5,6], [7,8]]
Double pointer
class Solution { public List<List<Integer> > findContinuousSequence(int sum) { int i = 1, total = 0; List<List<Integer>> res = new ArrayList<>(); List<Integer> temp = new ArrayList<>(); for(int k = 1; k < sum; k ++){ total += k; temp.add(k); while(total > sum){ temp.remove((Integer)i); total -= i; i++; } if(total == sum)res.add(new ArrayList<>(temp)); } return res; } }
77. Flip word order
Input an English sentence, turn the order of the words in the sentence, but the order of the characters in the word does not change.
For the sake of simplicity, punctuation is treated just like ordinary letters.
For example, if the input string "I am a student.", "student. a am I" is output.
Example
Input: "I am a student." Output: "student. a am I"
class Solution { public String reverseWords(String s) { String[] str = s.trim().split(" "); StringBuilder sb = new StringBuilder(); for(int i = str.length - 1; i > 0; i--){ if(str[i].trim().length() == 0) continue; sb.append(str[i].trim()).append(" "); } sb.append(str[0].trim()); return sb.toString(); } }
78. Left rotation string
The left rotation operation of a string transfers several characters in front of the string to the end of the string.
Please define a function to implement the left rotation operation of string.
For example, enter the string "abcdefg" and the number 2, and the function will return the result "cdefgab" obtained by rotating 2 bits to the left.
be careful:
- The data guarantees that n is less than or equal to the length of the input string.
Example
Input: "ABCDEFG", n = 2 Output: "cdefgab"
Direct string
class Solution { public String leftRotateString(String str,int n) { String temp = str.substring(0,n),res = str.substring(n); res += temp; return res; } }