有一说一,觉得官方的思路太取巧了,于是就试着按照比较一般化的思路做的,发现运算量还挺大的。采用哈希表的思路。运算复杂度较高,但具有一般性。
java版本
class Solution {
public String originalDigits(String s) {
int tmp=0;
int key_value=0;
String[] nums=new String[]{"zero","six","eight","two","seven","five","four","three","one","nine"};
int[] seq=new int[]{0,6,8,2,7,5,4,3,1,9};
List<Integer> arr_res=new ArrayList<Integer>();
HashMap<String,Integer> hashmap=new HashMap<String,Integer>();
for(int i=0;i<s.length();i++){
String key=s.substring(i,i+1);
if(hashmap.containsKey(key)){
key_value=hashmap.get(key);
key_value++;
hashmap.replace(key,key_value);
}else{
hashmap.put(key,1);
}
}
StringBuffer buff= new StringBuffer("");
String num,key;
int visit;
for (int i=0;i<nums.length;i++){
num=nums[i];
tmp=0;
visit=0;
while(tmp==0){
visit=0;
for (int j=0;j<num.length();j++){
key=num.substring(j,j+1);
if(!hashmap.containsKey(key) || hashmap.get(key)==0 ){
tmp=1;
}else{
visit++;
}
}
if(visit==num.length()){
for (int j=0;j<num.length();j++){
key=num.substring(j,j+1);
key_value=hashmap.get(key);
// System.out.println(key+":"+key_value);
key_value--;
hashmap.replace(key,key_value);
}
}
if(tmp==0){
arr_res.add(seq[i]);
}
}
}
Collections.sort(arr_res);
for(int i=0;i<arr_res.size();i++){
buff.append(String.valueOf(arr_res.get(i)));
}
return buff.toString();
}
}
剑指 Offer II 004. 只出现一次的数字
java版本哈希表思路,很好理解和实现,Go版本参考了官方思路,实在想不到位运算的思路。
java版本
class Solution {
public int singleNumber(int[] nums) {
HashMap<Integer,Integer> hashmap=new HashMap<Integer,Integer>();
for(int i=0;i<nums.length;i++){
if(hashmap.containsKey(nums[i])){
hashmap.replace(nums[i],3);
}else{
hashmap.put(nums[i],1);
}
}
for(int key:hashmap.keySet()){
if (hashmap.get(key)==1){
return key;
}
}
return 0;
}
}
Go版本
func singleNumber(nums []int) int {
ans:=int32(0)
for i:=0;i<32;i++{
total:=int32(0)
for _,num:=range nums{
total+=int32(num)>>i&1;
}
if total%3>0{
ans|= 1<<i;
}
}
return int(ans);
}
网友评论