题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
思路:
abc
a bc b ac c ab
a b c a c b b a c b c a c a b c b a
增加一个标记,指示当前位置,并把当前位置的字母与后面的字母交换,然后标记+1.递归
class Solution {
public:
set<string>temp_data;
void process(string str,int n)
{
int len=str.size();
if(n==len)
temp_data.insert(str);
for(int i=n;i<len;++i)
{
swap(str[i],str[n]);
process(str,n+1);
swap(str[i],str[n]);
}
}
vector<string> Permutation(string str) {
if(str.empty())
return {};
process(str,0);
vector<string>data(temp_data.begin(),temp_data.end());
return data;
}
};
# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.data=[]
def process(self,ss,n):
length=len(ss)
if length==n and ''.join(ss) not in self.data:
self.data.append(''.join(ss))
for i in range(n,length):
ss[n],ss[i]=ss[i],ss[n]
self.process(ss,n+1)
ss[n],ss[i]=ss[i],ss[n]
def Permutation(self, ss):
# write code here
if len(ss)==0:
return [];
ss=list(ss)
self.process(ss,0)
return sorted(self.data)
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路:第一种:排序,不过复杂度为O(nlogn),第二种,分析数组结构
class Solution {
public:
int check(vector<int> numbers,int result)
{
unsigned long counts=0;
for(auto i : numbers)
if(i==result)
++counts;
if(counts>numbers.size()/2)
return result;
return 0;
}
int MoreThanHalfNum_Solution(vector<int> numbers) {
if(numbers.empty())
return 0;
int result=numbers[0];
int times=1;
for(unsigned long i=1;i<numbers.size();++i)
{
if(times==0)
{
result=numbers[i];
times=1;
}
else if(result == numbers[i])
++times;
else
--times;
}
return check(numbers,result);
}
};
# -*- coding:utf-8 -*-
class Solution:
def MoreThanHalfNum_Solution(self, numbers):
if len(numbers)==0:
return 0
target=numbers[0]
times=1
for i in range(1,len(numbers)):
if times==0:
target=numbers[i]
times=1
elif target==numbers[i]:
times+=1
else:
times-=1
return target if numbers.count(target)>=len(numbers)/2+1 else 0